下面两个指针感觉表示的东西是一样的,但是实际上一个对一个错。求原因,编译环境是OS X 10.10.2 Clang
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int intcmp(const void *v1, const void *v2){ //Segment Fault
return (*((int*)(*(int*)v1)) - *((int*)(*(int*)v2)));
}
int intcmp1(const void *v1, const void *v2){ //No Problem
return (**(int**)v1-**(int**)v2);
}
int main(int argc, char *argv[]) {
int a[5]={0,1,2,3,4};
int **b,i;
b=calloc(5,sizeof(int*));
for(i=0;i<5;i++){b[i]=&a[i];}
printf("cmp1 begin\n");
qsort(b,5,sizeof(int*),intcmp1);
printf("cmp1 end\n");
printf("cmp1 begin\n");
qsort(b,5,sizeof(int*),intcmp);
printf("cmp2 end\n");
}
(((int *)((int )v1)) 是把v1当int的指针处理,在64位系统int是32位,地址是64位,所以(int)v1这个操作完成后值就已经错了,不能再当指针用了。
(int)v1 是把v1当int**的类型处理,也就是先解出存放int*的指针的地址,再解出int的值。
星号被当排版用了,显示有问题。