malloc() 导致循环中取消引用的二维字符数组崩溃

malloc() causing crash with de-referenced 2-D character array in loop

数组初始化为:

char** aldos = NULL;
char** aldoFilenames = NULL;

函数定义为:

int readFilesFromDirectory(char*** dest, char*** nameDest)

通过以下方式传递给函数:

readFilesFromDirectory(&aldos, &aldoFilenames);

统计完文件后,dest和nameDest被初始化:

*dest = (char**)malloc(sizeof(char*)*count);
*nameDest = (char**)malloc(sizeof(char*)*count);
count = 0; //resetting to read in the files again

nameDest 的第一个文件名读入如下:

*nameDest[count] = (char*) malloc(sizeof(char)*strlen(findData.cFileName) + 1);
strcpy(*nameDest[count], findData.cFileName);
//can confirm in my program, the value exists properly in *nameDest[count]
count++;

问题出在这里,当我将其放入循环中时,它崩溃了(没有真正有用的错误代码):

while (FindNextFile(hfind, &findData) != 0) 
{
  *nameDest[count] = (char*) malloc(sizeof(char)*strlen(findData.cFileName) + 1); //doesnt make it past here, CRASH
   sprintf(*nameDest[count],"%s[=15=]",findData.cFileName);
   count++;
 }

如有任何见解,我们将不胜感激,如果需要,我会尽快添加更多信息

*nameDest[count]the indexing operator place before the dereference operator 中,使代码等同于 *(nameDest[count]),这不是您想要的,因为 nameDest 指向数组。您需要在使用括号进行数组索引之前取消引用指针:(*nameDest)[count]

我还应该注意,为目录列表对 OS 进行两次轮询 - 一次用于计数,一次用于实际名称 - 是不可靠的,因为在两次轮询之间,计数可能已经改变。当您找到更多条目时,请考虑使用 realloc 调整数组大小。

代码中的几个问题

1) 表达式:sizeof(char) 被定义为 1 并且将任何值乘以 1 没有任何效果,尤其是作为 malloc() 参数的一部分,因此它只会使代码混乱而无济于事。

建议删除 sizeof(char) 表达式。

2) 内存分配系列(malloc、calloc、realloc)有一个返回类型 void* 可以分配给任何其他指针,因此不需要强制转换,只会使代码混乱并且是调试 and/or 维护代码时真的很头疼。

建议从 malloc() 中删除返回值的转换

3) 在 C 中,数组偏移量以 0 开始,以数组大小 -1 结束,因此当分配大小为 count 的数组时,有效偏移量为 0...count-1.

但是,发布的代码正在访问超过数组末尾的数组 [count],这是未定义的行为,can/will 会导致段错误事件。