在void数组上的qsort *

时间:2018-04-06 23:29:44

标签: c qsort

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

我做错了什么?

1 个答案:

答案 0 :(得分:6)

比较函数的参数是指向数组元素的指针,而不是数组元素本身。所以你需要比较他们指出的内容。

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