尝试关注this示例。 (章节字符串排序......)
在stdlib的qsort.c中有没有明显的事情会导致崩溃?
我还尝试了 cstring_cmp ,strncmp最多指定30个字符,比我的要多得多。
* fileArray [20]似乎正确填充了字符串
谢谢。
char* ptr_fileName;
char* fileArray[20];//number of files
size_t strings_len;
ptr_fileName = (char*)malloc((strlen(FindFileData.cFileName)+1)*sizeof(char));
memcpy(ptr_fileName, FindFileData.cFileName, strlen(FindFileData.cFileName)+1);
fileArray[i] = ptr_fileName;
strings_len = sizeof(fileArray) / sizeof(char *);
qsort(fileArray, strings_len, sizeof(char *), cstring_cmp);
//crashing in qsort.c
qsort c-string比较功能:
/* qsort C-string comparison function */
int cstring_cmp(const void *a, const void *b)
{
const char **ia = (const char **)a;
const char **ib = (const char **)b;
return strcmp(*ia, *ib);
/* strcmp functions works exactly as expected from
comparison function */
}
答案 0 :(得分:4)
你说你只用10个字符串填充fileArray,留下10个未初始化的条目。
当你调用qsort时,你传递20作为strings_len参数。 当然,这会导致不确定的行为。
您必须提供qsort准确信息。
如果要在数组中传递10个字符串,则还必须将数字10作为要排序的元素数传递。
注意: 如果您按照我之前的答案,在cstring_cmp上设置断点,您将很快看到何时使用无效数据调用compare方法,直接导致崩溃。
答案 1 :(得分:2)
你如何填充:
char* fileArray[20];
就目前而言,它是一组未初始化的指针。
答案 2 :(得分:2)
在cstring_cmp中设置一个断点,并观察每次调用它。
查看cstring_cmp或qsort中是否发生了最终崩溃。 在崩溃之前检查fileArray的状态。
答案 3 :(得分:1)
* fileArray [20]似乎正确填充了字符串。
fileArray之前的星号让我怀疑你填充数组的方式的正确性。 我没有发现任何可能破坏你代码的事情。
答案 4 :(得分:0)
由于你没有初始化fileArray的内容,它合法包含随机内存,而不是合法的char指针。