Вы сортируете и затем печатаете maxsize
элементы, когда ваш массив содержит только counter
элементов (после вашего первого while
l oop). Вы должны использовать точное количество элементов при сортировке и при печати.
Тот факт, что вы видите много 0
, является просто совпадением. Когда вы выделяете пространство с помощью malloc()
, содержимое вашего массива равно undefined , что означает, что все, что вы явно не перезаписываете, будет иметь неопределенное значение (это может быть 0
или это может быть другое случайное значение). Когда вы сортируете, все 0
будут перемещены в начало, но все остальное, что было неопределенным (а не 0
), фактически попадет в середину ваших данных, возможно, станет неотличимым от реальных данных.
Это не ошибка qsort
, это ошибка malloc
(и, в конечном счете, ваша ошибка).
TL; DR: сохраняйте переменную, содержащую точное число элементов в массиве и никогда не работают после этого числа.
Быстрое решение (я пометил модификации с помощью ^^^
):
int total = 0;
// ^^^^^
int counter = 0;
char c;
while(fgets(buff, 200, fd)) {
if(buff[0] == '#')
continue;
sscanf(buff,"%d%d", &array[counter].start, &array[counter].end);
total++;
// ^^^^^
if(total == maxsize)
// ^^^^^
maxsize = doublesize(&array, maxsize);
}
qsort(&array[0], total, sizeof(path), cmp);
// ^^^^^
for(int i = 0; i < total; i++){
// ^^^^^
printf("%d\t%d\n", array[i].start, array[i].end);
if(array[i].start == 0)
counter++;
}