2

在 qsort 中:

void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));

文档解释:

size
Size in bytes of each element in the array.
size_t is an unsigned integral type.

但通常 qsort 被调用为qsort(...,...,sizeof(int),...), 或qsort(...,...,sizeof(char *),...)

如果我理解正确,由于无法确定字符串的大小,因此不再重要,而是使用 sizeof(char*) 作为类型声明。

有什么解释吗?

4

1 回答 1

3

qsort需要一个可以被视为数组的连续内存块。因此,数组中的每个项目必须具有相同的大小,并且您qsort在调用它时提供该大小。

如果您想将实际字符串存储在数组中,它们的大小必须相同,即最大字符串的大小。

而且,当您的比较函数比较它们时,qsort几乎肯定会移动大量内存来完成排序,因为它会自己交换字符串。

更常见的是将字符串本身存储在数组区域之外,并仅使用数组来存储指向这些字符串的指针。指针本身将被交换,但平均而言它们将比它们指向的字符串小得多。

例如,使用:

char *strings[] = {"xyzzy", "zorkmid", "twisty little passages", "plugh"};

strings数组由四个指向这些字符串的指针组成,每个指针占用四个字节(在我的系统上,您的可能不同)。对数组进行qsort排序时,在该数组中移动的唯一东西是指针。

于 2013-08-13T07:54:22.550 回答