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