您调用qsort
only 是偶然的:
qsort((void *) &array, sizeof(array) / sizeof(struct my_struct), sizeof(struct my_struct), *compare);
数组的地址与数组的第零个元素的地址具有相同的值但类型不同。演员表void *
也是多余的;并且比较器函数的解引用也是一种惯例。通常会这样写:
qsort(array, sizeof(array) / sizeof(array[0]), sizeof(struct my_struct), compare);
或者:
qsort(array, sizeof(array) / sizeof(array[0]), sizeof(array[0]), compare);
如果你有一个动态分配的结构:
size_t num_items = 4;
struct my_struct *dynarr = malloc(sizeof(struct my_struct) * num_items);
或者:
struct my_struct *dynarr = malloc(sizeof(*dynarr) * num_items);
那么您将在对 的调用中以不同的方式指定元素的数量qsort
,但其余部分基本不变:
qsort(dynarr, num_items, sizeof(*dynarr), compare);
特别注意&
前面没有dynarr
,它是一个简单的指针变量,因为它的名称可能具有误导性。
为什么你的代码出错了
一个猜测,但一个合理的猜测。 如果你写:
qsort(&dynarr, sizeof(dynarr) / sizeof(dynarr[0]), sizeof(dynarr[0]), compare);
thensizeof(dynarr)
是指针的大小(例如 64 位程序中的 8 个字节),并且sizeof(dynarr[0])
是 16 个字节,因此您告诉qsort()
排序的大小(元素数)为 0(因为8 / 16 == 0
),因此永远不会调用比较器. 如果您的程序编译为 32 位程序,则指针大小为 4 字节,结构大小为 8,因此结果仍然为 0。
请注意,如果您改为传递4
或num_items
作为数组的大小,那么您会崩溃。的地址dynarr
是传递给函数的错误地址;您想传递保存在 中的地址值,而不是存储自身dynarr
的地址。dynarr
注意:你应该证明qsort()
那行不通,这样我们就不必猜测你写了什么。