对 void* 数组进行排序

qsort on array of void*

所以,我有一个比较两个 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));
}

顺便说一句,你所做的并不是很明确。将指针转换为整数的结果是implementation-dependent。

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;
}