在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 *)作为类型声明。
有任何解释吗?
答案 0 :(得分:3)
qsort
需要一个可以视为数组的连续内存块。因此,阵列中的每个项目大小必须相同,并且在调用它时将该大小提供给qsort
。
如果要将实际的字符串存储在数组中,它们需要具有相同的大小,即最大的大小。
而且,当你的比较函数比较它们时,qsort
几乎肯定会移动大量的内存来完成排序,因为它会自己交换字符串。
更常见的是让字符串本身存储在数组区域的外部,并使用该数组将指针存储到这些字符串中。指针本身将被交换,但它们的平均值将比它们指向的字符串小得多。
例如,使用:
char *strings[] = {"xyzzy", "zorkmid", "twisty little passages", "plugh"};
strings
数组包含四个指向这些字符串的指针,每个指针占用四个字节(在我的系统上,你的可能不同)。当qsort
对数组进行排序时,在该数组中移动的唯一内容是指针。