繁体   English   中英

使用qsort对C中的字符串数组进行排序时出现分段错误

[英]Getting Segmentation fault when using qsort for sorting array of strings in C

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

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是我数组中元素的正确数量。 但是,当我尝试运行代码时遇到了段错误。 谁能告诉我为什么?

您将错误的大小传递给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);
}

即使您拥有的东西也可以工作。

段故障是由于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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM