问题出在比较函数
comfunc
中的类型转换操作符上。
int cmpfunc(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
将空指针
a
转换为
int *
并进行反引用,意味着它将从
a
所包含地址的开始处读取
sizeof(int)
字节。因此,返回语句中的表达式是将来自
a
所在地址的
sizeof(int)
字节数与来自
b
所在地址的
sizeof(int)
字节数进行比较,而非比较指针
a
和
b
所包含地址中的字符。为了说明这一点,我将比较函数更改为
int cmpfunc(const void *a, const void *b) {
printf("comparing %c and %c\n", *((char *)a), *((char *)b));
printf("compare as int %d - %d = %d\n", *(int *)a, *(int *)b, *(int *)a - *(int *)b);
printf("compare as char %d - %d = %d\n", *(char *)a, *(char *)b, *(char *)a - *(char *)b);
return *(char *)a - *(char *)b;
}
这是我得到的输出。
comparing b and c
compare as int 1634034530 - 1684104547 = -50070017
compare as char 98 - 99 = -1
comparing a and d
compare as int 25697 - 100 = 25597
compare as char 97 - 100 = -3
comparing e and a
compare as int 6578533 - 25697 = 6552836
当将类型转换为
int *
和
char *
后进行比较时,读取的值之间存在差异。应更改比较函数为:
int cmpfunc(const void *a, const void *b) {
return *(char *)a - *(char *)b;
}
此外,您不需要将
strlen
函数和
sizeof
运算符的结果转换为
size_t
类型,因为它们已经返回
size_t
类型的值。此外,使用数组元素上的
sizeof
更易读且更易于维护。您应该简单地调用
qsort
。
qsort(str, strlen(str), sizeof str[0], cmpfunc);
str1
被初始化为"bcead\0"
,大小为6。它不在“不可变的RAM”中。关于int
部分是正确的。 - chux - Reinstate Monica