Элементы в массиве имеют тип Ancestor *
, и это то, что вы должны использовать в качестве операнда для sizeof
.Указатели, данные для функции сравнения, являются указателями на тип элемента , приведенный к void *
, следовательно, вы приводите их обратно к Ancestor **
и разыменованию.
qsort(listOfGreatUncles->ancestor, listOfGreatUncles->size, sizeof (Ancestor *), compare);
или к форме, которая всегда дает правильный размер, если сам массив правильно введен:
qsort(listOfGreatUncles->ancestor,
listOfGreatUncles->size,
sizeof listOfGreatUncles->ancestor[0],
compare);
т.е.
qsort(array, length, sizeof array[0], compfunc);
И наконец
int compare(const void *s1, const void *s2) {
Ancestor *a1 = *(Ancestor **)s1;
Ancestor *a2 = *(Ancestor **)s2;
printf("a1 yearOfBirth %d\n", a1->yearOfBirth);
printf("a2 yearOfBirth %d\n", a2->yearOfBirth);
return (a1->yearOfBirth - a2->yearOfBirth);
}
Ивозвращаемое значение на самом деле должно быть
return (a1->yearOfBirth > a2->yearOfBirth) - (a1->yearOfBirth < a2->yearOfBirth);
, чтобы избежать неопределенного поведения при экстремальных значениях int
.