为什么这个qsort()不起作用?

我正在排序一个字符串数组(不区分大小写)。

qsort导致分段错误,可能是我的演员不合适。

#include  #include  #include  int compare(const void *string1, const void *string2) { char *a = (char*)(string1); char *b = (char*)(string2); printf("comparing %s AND %s\n", a, b); return strcasecmp(a,b); } void sortListName(char **fileList, int noOfFiles) { printf("Sorting\n"); qsort(fileList, noOfFiles, 260*sizeof(char), compare); return; } 

** fileList =字符串数组(文件名)

PS main()显而易见,工作正常。

我会调整一些东西,这样你只需要对一个简单的数组进行排序,在这种情况下指向char – qsort将安排你获取指向该数组中两个元素的指针(即char **指针),以及一些基本的需要解除引用才能通过strcasecmp获得与char相关的“指针”。 @Mark很可能在你看不见的调用代码中泄露了260的来源,但我不是C中那些2d数组的忠实粉丝。

以下函数对我来说,用main()来演练它。

 #include  #include  #include  int compare(const void *v1, const void *v2){ char *a = *(char **)v1; char *b = *(char **)v2; printf("comparing %s to %s\n", a, b); return strcasecmp(a,b); } void sortListName(char **fileList, int noOfFiles){ printf("Sorting\n"); qsort(fileList, noOfFiles, sizeof(*fileList), compare); return; } int main(void) { char *filenames[] = { "/var/www/icons/comp.gray.png", "/var/www/error/HTTP_SERVICE_UNAVAILABLE.html.var", "/var/www/icons/right.gif", "/var/www/error/HTTP_NOT_IMPLEMENTED.html.var", "/var/www/icons/pie3.png", "/var/www/icons/pie2.png", "/var/www/htdocs/manual/mod/mod_proxy_balancer.html", "/var/www/htdocs/manual/programs/rotatelogs.html", "/var/www/htdocs/manual/vhosts/mass.html", "/var/www/icons/movie.png", "/var/www/htdocs/manual/images/caching_fig1.png", "/var/www/htdocs/htdig/search.html", "/var/www/icons/generic.gif", "/var/www/htdocs/manual/mod/quickreference.html", "/var/www/icons/small/blank.png", "/var/www/icons/image2.gif" }; int i, nf = (int) (sizeof(filenames) / sizeof(filenames[0])); puts("Unsorted:"); for (i = 0; i < nf; i++) { puts(filenames[i]); } sortListName(filenames, nf); puts("Sorted:"); for (i = 0; i < nf; i++) { puts(filenames[i]); } return 0; } 

如果这是你与qsort相关的所有代码,看起来你声明了comparePtr函数指针,但它仍然没有被初始化; 它没有指向你的comparefunction(这是我想你想要它指出的)。

之后,还有一些事情:

1) comparePtr具有正确的类型,但是compare没有。 它需要接受两个const void* ,但是你有两个const void**
2)修复类型后,你可以将compare传递给qsort ,而不是制作一个函数指针并传递它。
3)我不相信qsort的第一个论点是正确的。 你想传入指向数组中第一个元素的指针,它应该只是fileList (我假设它指向数组中的第一个字符串)。
4)第三个论点也不正确。 fileList是一个char** ,意味着你传入一个char * s数组,因此第三个参数应该只是sizeof(char*) ,而不是字符串的strlen