使用qsort的Segfault

时间:2011-09-11 23:10:27

标签: c segmentation-fault qsort

我需要对一个字符数组进行排序,以便迭代它并打印出唯一的数据点及其计数。此数组保存在链接列表节点中,我想使用qsort来执行此操作。不幸的是,我正在那条特定的线路上遇到一个段错误。

void printArray(Node_ptr node){

    int count=0; //character count

    char *temp= node->attributes; //duplicate attribute array



    char cur; //current char

    char *outputCat= emalloc(150); //concatenate counts to a single string

    outputCat= "Attribute %d counts are: ";



    qsort(&temp, lineCount, sizeof(char), compare); //sort the array

    ... more code
}

我在man qsort

中填写了比较方法
int compare(const void *a, const void *b){

  return strcmp(*(char * const *) a, *(char * const *) b);

}

在DDD中,qsort行是触发段错误的行。我原本以为这是由于参数的不准确,所以我输入了一些调试printf语句。 printf("%s", temp)打印出1000个字符,这正是linecount应该是的。字符各为1个字节,因此此处不需要sizeof(char)

该行上ddd的错误报告是

Program received signal SIGSEGV, Segmentation fault.    
0xb7f8c498 in ?? () from /lib/libc.so.6

这是qsort的错吗,还是我代码的其他错误?

2 个答案:

答案 0 :(得分:4)

这个

qsort(&temp, lineCount, sizeof(char), compare);

应该是:

qsort(temp, lineCount, sizeof(char), compare);

您不需要传递指针的地址!

qsort的第一个参数是一个指针,所以如果你传给它一个指针,你不需要使用address-of运算符,否则你传递一个指向指针的指针,这不是在这种情况下你想要什么。

答案 1 :(得分:2)

如果要对字符进行排序,qsort()的第一个参数应该是字符指针,而不是指向字符指针的指针。 strcmp()

也是如此

另外:请添加struct node的定义。