Таким образом, мой начальный массив должен выглядеть так: 5, 9, 1, 3, 0, 0, 0, 0, 0, 0.
Нет, нет, тысячу раз,нет: -)
Если вы хотите, чтобы там были нули, либо используйте calloc
, чтобы обнулить все, либо вставьте их в себя.malloc
даст вам (как в исходном коде) блок требуемого размера, который содержит неопределенный контент.Другими словами, он вполне может иметь любой мусор, который был в памяти заранее.
И, кроме того, a
и b
являются указателями в вашей функции comp
,вы должны использовать ->
, а не .
, и это хороший способ использовать правильный прототип с приведением.
И последнее замечание: пожалуйста, не приводите возвращение из malloc
- вы можете получитьв проблемы, если вы случайно забыли включить соответствующий заголовочный файл, а ваши целые числа не совместимы с вашими указателями.
Функция malloc
возвращает void *
, который вполне успешно неявно преобразуется в любой другой указатель.
Вот полная программа с этими исправлениями:
#include <stdio.h>
#include <stdlib.h>
typedef struct {int size; int id;} DATA;
int comp (const void *a, const void *b) {
return ((DATA *)a)->size - ((DATA *)b)->size;
}
int main (void) {
int i;
DATA *myArray = malloc(10 * sizeof(DATA));
myArray[0].size = 5;
myArray[1].size = 9;
myArray[2].size = 1;
myArray[3].size = 3;
for (i = 4; i < 10; i++)
myArray[i].size = 0;
qsort (myArray, 10, sizeof(DATA), comp);
for (i = 0; i < 10; i++)
printf ("%d ", myArray[i].size);
putchar ('\n');
return 0;
}
Вывод:
0 0 0 0 0 0 1 3 5 9