2009-08-27 127 views
2

试图按照this的例子。 (部分字符串排序...)
是否有任何明显的,会在stdlib的qsort.c这崩溃?
我也试过cstring_cmp与strncmp指定最多30个字符,比我有更多。
* fileArray [20]似乎正确填充字符串。
谢谢。qsort崩溃程序 - C

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 

快速排序C-字符串比较功能:

/* 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

为什么你的问题标记为C++?这是C代码,你正在以(硬)C方式进行。 – sbi 2009-08-27 18:06:55

+0

你可以显示你用来初始化字符串的代码吗? – 2009-08-27 18:09:09

+0

也许他使用C++编译器来编译代码,并且标准(也许)有不一致的地方,比如单元化内存被填满。这_matters_。 – 2009-08-27 18:09:12

回答

4

你说你只用10个字符串填充fileArray,剩下10个条目未初始化。

当你调用qsort时,你传递20作为strings_len参数。 这当然会导致未定义的行为。

你必须给qsort准确的信息。

如果要在数组中传递10个字符串,则还必须传递数字10作为要排序的元素数。

注: 如果你按照我刚才的答复,在cstring_cmp设置断点,你会很快看到当比较方法被称为无效数据,直接导致飞机坠毁。

2

你如何填充:

char* fileArray[20]; 

因为它的立场,这是未初始化数组的指针。

+0

添加了如何填充阵列。 – 2009-08-27 18:10:40

+0

不,你没有。发布完整的真实代码。 – 2009-08-27 18:13:44

1

*fileArray[20] seems to be correctly populated with strings.

fileArray之前的星号让我怀疑您填充数组的方式的正确性。 我没有看到任何可能会破坏你的代码的东西。

0

由于您没有初始化fileArray的内容,它合法的包含随机内存,而不是合法的字符指针。

2

在cstring_cmp中设置一个断点,并且每次都会调用它。

看看最终崩溃发生在cstring_cmp还是qsort中。 检查崩溃前fileArray的状态。