【问题标题】:Getting Segmentation fault when using qsort for sorting array of strings in C使用 qsort 对 C 中的字符串数组进行排序时出现分段错误
【发布时间】:2015-11-18 07:22:51
【问题描述】:

我正在尝试对我这样初始化的字符串数组进行排序。

char que[100][100];

这是我的比较函数

int compfunc(const void * a, const void * b){
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

这是我对 qsort 的调用

qsort(que, size, sizeof(char *), compfunc);

size 是我在数组中拥有的正确元素数。 但是当我尝试运行代码时出现分段错误。 谁能告诉我为什么?

【问题讨论】:

    标签: c arrays segmentation-fault qsort


    【解决方案1】:

    段错误是由于compfunc函数

    int compfunc(const void * a, const void * b){
        const char **ia = (const char **)a;
        const char **ib = (const char **)b;
        return strcmp(*ia, *ib);
    }
    

    不需要额外的(和错误的)强制转换导致非指针的取消引用和分段错误(实际上是未定义的行为)

    int compfunc(const void * a, const void * b){
        return strcmp(a, b);
    }
    

    给你你所需要的。

    另外,正如 R Sahu 提到的,给 qsort 的元素的大小也是错误的,它应该是您想要比较(和排序)的元素之一的大小,即例如que[0] 的大小,或*que

    qsort(que, size, sizeof(*que), compfunc);
    

    【讨论】:

      【解决方案2】:

      您将错误的大小传递给qsort

      qsort(que, size, sizeof(char *), compfunc);
                       ^^^^^^^^^^^^^^
      

      应该是:

      qsort(que, size, sizeof(que[0]), compfunc);
      

      记住&q[0]&q[1]的数值差是100,和sizeof(q[0])是一样的。

      另外,为了迂腐,compfun 中的指针类型必须是 char (*)[100],而不是 char**。毕竟,q 会衰减为 char (*)[100] 类型的指针。

      int compfunc(const void * a, const void * b){
          const char (*ia)[100] = (const char (*)[100])a;
          const char (*ib)[100] = (const char (*)[100])b;
          return strcmp(*ia, *ib);
      }
      

      即使你拥有的东西应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2011-07-19
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多