繁体   English   中英

卡住了!..分段错误,qsort_r,数组,指针的混合

[英]Stuck!.. a mix of segmentation fault, qsort_r, arrays, pointers

我希望我做的简短,并明确我在下面要做的事情。

对于SOF问题,代码非常复杂,我不认为可以简化它,同时又可以让其他人直接测试它。

所以我切了相关的部分,并把它们放在这里。

为什么我会收到此错误,您能帮我解决此错误吗?

任何帮助表示赞赏!

谢谢。

    char words[100][WORD_LENGTH];

    char temp[WORD_LENGTH];

    // scan the next %s from stream and put it to temp
    while(fscanf(file, "%s", temp) > 0){
        // printf("reducer reads: %s\n", temp);

        strcpy(words[arr_i], temp);
        printf("%d -- %s\n", arr_i, words[arr_i]);

        arr_i++;

    }

在第二行,我得到分段错误错误。 (并且可能与valgrind一起泄漏)

    int thunk = WORD_LENGTH; 
    qsort_r(&words, sizeof(words)/sizeof(words[0]), sizeof(words[0]), cmpstringp, &thunk);

来自“ man qsort”:

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);
}

根据man qsort

qsort_r()函数与qsort()相同,区别在于比较函数compar采用第三个参数

您的比较函数采用两个参数。

更新 :真正的崩溃原因如下。 您将传递给char[WORD_LENGTH]类型的数组的compare函数元素,而不是man qsort示例中的char* 因此,传递给比较函数的参数为​​p1 =&words [_],这是指向要比较的字符串的指针。 对于char指针,它应该是(char **) ,只是一个指向char / string指针的指针。 因此,强制转换为strcmp(* (char * const *) p1, * (char * const *) p2); 是不必要和有害的,因为在您的情况下,最左侧的取消引用是问题的原因。 删除它们,只留下strcmp(p1, p2)
作为附带说明,此问题再次强调了字符串数组声明为char *[]char [][]之间的区别。

暂无
暂无

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

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