我试图对结构记录数组进行排序。由于某种原因,核心转储不断发生。
当我尝试使用一系列整数或结构进行同样的操作时,它的工作原理非常好。但是,当我开始使用嵌套结构时,它开始核心转储。
目前的输出是:
Before sorting
first last 0
first last 1
first last 2
first last 3
first last 4
first last 5
AFTER sorting
Segmentation fault (core dumped)
编译器:Cygwin
typedef struct {
char last[NAMESIZE]; /* last name (1 word) */
char first[NAMESIZE]; /* first name (1 word) */
} name;
typedef struct {
name name;
int score; /* score (between 0 & 100 inclusive) */
} record;
int compare (const void * a, const void * b){
const record *recordA = (record *)a;
const record *recordB = (record *)b;
printf("%d: %d", recordA->score, recordB->score);
return ( recordB->score - recordA->score );
}
int main (){
record ** list;
int i;
list=malloc(6*sizeof(record*));
printf("Before sorting\n");
for(i=0; i<6; i++){
list[i]=malloc(sizeof(record));
strcpy(list[i]->name.first,"first");
strcpy(list[i]->name.last,"last");
list[i]->score=i;
}
for (i=0; i<6; i++){
printf ("%s %s %d\n",list[i]->name.first, list[i]- >name.last,list[i]->score);
}
printf("AFTER sorting\n");
qsort (list, 6, sizeof(record), compare);
for (i=0; i<6; i++){
printf ("%s %s %d\n",list[i]->name.first, list[i]- >name.last,list[i]->score);
}
return 0;
}
答案 0 :(得分:0)
list
是一个包含record
的6个指针的数组:
list=malloc(6*sizeof(record*));
因此您需要将相同的尺寸传递给qsort
。
qsort (list, 6, sizeof(record), compare);
应该是
qsort (list, 6, sizeof(record*), compare);
或更好
qsort (list, 6, sizeof(*list), compare);
答案 1 :(得分:0)
我同意第一个答案。但有一点很清楚,你不应该使用 qsort(list,6,sizeof(record),compare),其中sizeof(record)将返回记录的总字节数,但不会自动计算名称使用的字节数。 也不 qsort(list,6,sizeof(record),compare),其中sizeof(record)将返回4个字节的记录*,因为它是一个指针。 相反,我想也许您只需要自己计算字节数,并在数据结构记录中添加其他数据,如namesize
答案 2 :(得分:0)
如果您有两个记录的比较函数,则需要将它们分配给指向记录的常量的指针。
在你的qsort中,我猜你已经传入了你的记录列表数据结构,所以元素的数量将是你的。
font-size:24px