2016-03-26 17 views
-1

構造体レコードの配列をソートしようとしています。何らかの理由でコアダンプが発生し続ける。C入れ子構造体のqsort配列

intや構造体の配列で同じことをしようとすると、正常に動作します。しかし、ネストされた構造体の使用を開始すると、コアダンプが開始されます。

電流出力は次のようになります。

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

コードに 'struct record'の配列がありません。 'struct record'に*ポインタ*の配列があります。そして、これは '' qsort''にしようとしていることです。だから、あなたのコード内の他のものはそれに応じて書き直すべきです。 'qsort'を呼び出すと間違っています。比較機能が正しくありません。 – AnT

答えて

0

listrecordから6つのポインタの配列である:

list=malloc(6*sizeof(record*));

ので、あなたが渡す必要があります同じサイズのqsort

qsort (list, 6, sizeof(record), compare);

qsort (list, 6, sizeof(record*), compare); 

またはより良いまだ、私は一つのことは明らか最初answer.Butに同意してい

qsort (list, 6, sizeof(*list), compare); 
0

は、あなたが( qsort関数を使うべきではないということであるべきですsizeof(record)はレコードの総バイト数を返しますが、名前が使用するバイト数は自動的にはカウントしません。 でも qsort(list、6、sizeof(record)、compare)。sizeof(record)はポインタなので、record *の4バイトを返します。 代わりに、自分のバイト数をカウントし、名前構造のような別のデータをデータ構造レコードに追加する必要があるかもしれません。

0

2つのレコードの比較機能を使用する場合は、レコードを指す定数に変換します。

あなたのqsortでは、あなたのレコードリストのデータ構造を渡したと思いますので、要素の数はあなたの未使用になります。

/*Comparison function: Score ascending only.*/ 
int cmp_sasc(const void *p, const void *q){ 
    record * const *pp = p; 
    record * const *qq = q; 
    return (*pp)->score - (*qq)->score; 
} 
+0

なぜレコードを指す定数へのポインタにそれらを割り当てる必要がありますか? void *を適切なポインタにキャストするために、比較関数内のポインタにそれらを代入する点はありませんか? – macchagreen