【问题标题】:Is the manpage of qsort(3) right?qsort(3) 的联机帮助页对吗?
【发布时间】:2011-05-07 13:22:42
【问题描述】:

qsort(3) 库例程的联机帮助页提供了一个对命令行上作为参数给出的单词进行排序的示例。比较函数如下:

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是chars指针的指针,也可以看成chars指针表。

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

【问题讨论】:

  • 如果您对一个整数数组进行排序,那么您是否期望将const void* p1 转换为int,而不是const int*?一个 10KB 结构的数组呢,其中的元素比 void* 可能大得多?
  • 虽然使用该代码来了解正在发生的事情是完全合理的,但您可能需要重新考虑问题的标题。我的意思是,您知道手册页和代码存在多长时间了? 有多少个眼球把它们吸进去了?

标签: c qsort


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    strcmp(* (char * const *) p1, * (char * const *) p2) ^^^^^^^^^^^^^^^^^^^^^

    所以p1* (char * const *) 类型,或者通过删除* 的(char * const);并且char *constchar * 的分配兼容,所以没问题:-)

    【讨论】:

      【解决方案3】:

      不,因为大概您会按如下方式调用qsort

      qsort(&argv[0], argc, sizeof(char*), cmpstringp);
      

      即你传递一个指向元素的指针,一个元素是const char *

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多