诡异的指针错误,segment fault

新手上路,请多包涵

下面两个指针感觉表示的东西是一样的,但是实际上一个对一个错。求原因,编译环境是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");
}
阅读 2.3k
1 个回答

(((int *)((int )v1)) 是把v1当int的指针处理,在64位系统int是32位,地址是64位,所以(int)v1这个操作完成后值就已经错了,不能再当指针用了。
(int)v1 是把v1当int**的类型处理,也就是先解出存放int*的指针的地址,再解出int的值。

星号被当排版用了,显示有问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进