qsort在这里工作,但如果阵列的每个成员v占用sizeof(void *),为什么qsort期待sizeof(int)?
#include <stdio.h>
#include <stdlib.h>
int comp(const void *pa, const void *pb)
{
int a = *(int *)pa;
int b = *(int *)pb;
if (a > b)
return +1;
else
if (b > a)
return -1;
else
return 0;
}
int main(void)
{
int i, a[] = {3, 1, 2, 0, 4};
void **v;
v = malloc(sizeof(void *) * 5);
for (i = 0; i < 5; i++) {
v[i] = &a[i];
}
for (i = 0; i < 5; i++) {
printf("%d\n", *(int *)v[i]);
}
qsort(v[0], 5, sizeof(int), comp); // why sizeof(int) if v is void **
printf("Sorted:\n");
for (i = 0; i < 5; i++) {
printf("%d\n", *(int *)v[i]);
}
free(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
qsort(v[0], 5, sizeof(int), comp); // why sizeof(int) if v is void **
Run Code Online (Sandbox Code Playgroud)
要传递给的排序内存块的起始地址qsort是
v[0] = &a[0]
Run Code Online (Sandbox Code Playgroud)
初始元素的地址a,因此您排序的数组a不是其初始元素v指向的块.a的元素是ints,sizeof(int)正确的大小也是如此.
如果要对指针数组进行排序,则需要传递该数组中第一个元素的地址&v[0],或者只是v传递给qsort.那么当然size参数必须是sizeof (void*):
qsort(v, 5, sizeof(void*), cmp);
Run Code Online (Sandbox Code Playgroud)
但为此,你不能使用你所拥有的比较功能
int cmp(const void *pa, const void *pb) {
int a = *(int*)(*(void**)pa);
int b = *(int*)(*(void**)pb);
if (a > b)
return +1;
else
if (b > a)
return -1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或类似的东西.因为传递给比较函数的qsort是要比较的事物的地址,我们需要一个间接来获得指向比较的指针,因为在这里我们想要通过int它们指向的值来比较指针,我们需要第二个间接到得到指向int的.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |