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 会导致段错误事件。
数组初始化为:
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 会导致段错误事件。