gpt4 book ai didi

c - 无效数组上的qsort *

转载 作者:行者123 更新时间:2023-12-02 08:08:00 26 4
gpt4 key购买 nike

因此,我有一个比较两个const void *指针的函数,如果一个指针具有更大的地址,则一个指针会比另一个更大

int func (const void* a, const void* b)
{
return (int)((long)(a) - (long)(b));
}

我有一个void *数组,并且array [0]大于array [1]
void* array[2];
void* a = malloc(10);
void* b = malloc(10);
if (func(a, b) < 0)
{
array[0] = b;
array[1] = a;
}
else
{
array[0] = a;
array[1] = b;
}
// for example, array contains 0x15cfeb0 and 0x15cfe90

之后,我正在执行qsort,数组不会改变!
qsort(array, 2, sizeof(void*), (*func));
// array is 0x15cfeb0 and 0x15cfe90 instead of expected 0x15cfe90 and 0x15cfeb0

我究竟做错了什么?

最佳答案

比较函数的参数是指向数组元素的指针,而不是数组元素本身。因此,您需要比较它们指向的内容。

int func (const void* a, const void* b)
{
return (int)((long)(*(void **)a) - (long)(*(void **)b));
}

顺便说一句,你在做什么不是很明确。将指针转换为整数的结果取决于实现。

将减去 long的结果转换为 int时,也会出现溢出。最好对它们进行小于或大于以下的测试:
uintptr_t aval = (uintptr_t)(*(void **)a);
uintptr_t bval = (uintptr_t)(*(void **)b);
if (aval == bval) {
return 0;
} else if (aval < bval) {
return -1;
} else {
return 1;
}

关于c - 无效数组上的qsort *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com