[英]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.