qsort(3)的手册页正确吗?

4
< p > qsort(3) 库函数的 man 手册给出了一个在命令行参数中排序单词的示例。比较函数如下:

static int
       cmpstringp(const void *p1, const void *p2)
       {
           /* The actual arguments to this function are "pointers to
              pointers to char", but strcmp(3) arguments are "pointers
              to char", hence the following cast plus dereference */

           return strcmp(* (char * const *) p1, * (char * const *) p2);
       }

这里正在排序的是argv的元素。现在argv是指向指针的字符,也可以看作是指向字符指针的表。

因此,它的元素是指向字符的指针,那么cmpstringp的实际参数不应该是"指向指针的字符",而是指向字符的指针吗?


1
如果您要对一个int数组进行排序,那么您是否希望将const void* p1转换为int而不是const int*? 那么如果是一组10KB的结构体数组呢?它们的元素比void*更大,这种情况下该怎么做? - Pete Kirkham
在理解代码的过程中,这是完全合理的,但您可能需要重新考虑您问题的标题。我的意思是,您是否意识到这个 manpage 和代码已经存在了多久?有多少人已经看过它们? - dmckee --- ex-moderator kitten
3个回答

7

qsort()函数的回调函数作为参数传递,其参数是指向两个要比较的值的指针。如果您对char *数组(例如argv [])进行排序,则这些值是char *(指向char的指针),并且比较函数将接收指向这些值的指针,即指向char的指针。


2
strcmp(* (char * const *) p1, * (char * const *) p2)
       ^^^^^^^^^^^^^^^^^^^^^

所以p1的类型是* (char * const *)或者,通过去掉*的方式,是(char * const);而char *const可以与char *互相赋值,所以没有问题 :-)


0
不会,因为你可能会按照以下方式调用qsort
qsort(&argv[0], argc, sizeof(char*), cmpstringp);

也就是说,您将其传递给指向元素的指针,而元素是一个const char *


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接