我正在研究一个基本的比较器函数,它以特定的顺序排列元素,我偶然发现了qsort()
。
我看到qsort()
需要数组的长度和数组元素的大小作为参数。为什么这两个值size_t length
和size_t item_size
是必需的?
qsort(void *array, size_t length, size_t item_size,
int (*compar)(const void*, const void*));
答案 0 :(得分:2)
如果没有数组qsort
的长度,就不知道要排序多少元素;如果没有单个元素的长度(以字节为单位),它将不知道如何在任意位置构造指向元素的指针,并在排序过程中移动元素。
理解为什么需要特定参数的一种简单方法是查看它在实现中的使用方式。可以使用qsort.c
的多个实现。您可以选择一个,并查看相关参数的使用方式。
答案 1 :(得分:0)
如果你看一下qsort
的原型。它接受void*
作为其数据array
的参数。所以它可能真的是任何东西而qsort
无法知道指向的元素的大小,就像你能够传递像int*
这样的独特类型指针一样。元素可以简单地像普通数组一样引用。
这意味着你需要通过告诉它这些元素的大小,以及通常的长度参数来帮助它。
因此, qsort
的实现将能够计算从地址array
到数组中每个length
元素的偏移量,将它们提供给比较器函数并将它们混洗适用时。