开发者社区> 问答> 正文

诡异的指针错误,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");
}

展开
收起
a123456678 2016-06-07 20:31:56 1538 0
1 条回答
写回答
取消 提交回答
  • 码农|Coder| Pythonista

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

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

    2019-07-17 19:31:01
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载