qsort崩溃程序 - C.

时间:2009-08-27 18:00:26

标签: c algorithm sorting

尝试关注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 */
    }

5 个答案:

答案 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指针。