2016-03-26 14 views
-1

Я пытаюсь сортировать массив записей структуры. По какой-то причине основной дамп продолжает происходить.C qsort массив вложенных структур

Когда я пытаюсь сделать то же самое с массивом ints или structs, он отлично работает. Однако, когда я начинаю использовать вложенные структуры, он начинает сбрасывать ядро.

Текущий результат:

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

list представляет собой массив из 6 указателей на record:

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

поэтому вам необходимо пройти того же размера до qsort.

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

должен быть

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

или еще лучше

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

Я согласен с первым answer.But одна вещь ясно, что вы не должны использовать QSort (list, 6, sizeof (record), compare), в котором sizeof (запись) вернет общие байты записи, но автоматически не подсчитывает байты, используемые этим именем. или qsort (list, 6, sizeof (record), compare), в котором sizeof (record) вернет 4 байта записи *, поскольку это указатели. Вместо этого, я думаю, вам может понадобиться просто подсчитать байты самим собой и добавить в вашу запись данных данные, такие как namesize.

0

Если у вас есть функция сравнения для двух записей, вы хотите назначить их указателю к константе, указывающей на запись.

В вашем 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

Смежные вопросы