开发者社区> 问答> 正文

看似简单的C语言二级指针怎么那么难-第二季?? 400 报错

看似简单的C语言二级指针怎么那么难-第二季?? 400 报错

我根据上一个提问, 写了另外一个测试程序, 也出错了, 为什么呢?

奇怪, 编译通过, 但同样是出现了上次的segmant fault错误!!!!


struct data {
    int sh;
};

struct data test[2];

void change(struct data **d)
{
    int i = 0;
    struct data *p = NULL;

    for (i = 0; i < 2; i++) {
        printf("step %d\n", i);

        p = d[i];
        p->sh = 2;
    }
}

int main(void)
{
    test[0].sh = 1;
    test[1].sh = 1;

    change(&test);

    printf("%d %d\n", test[0].sh, test[1].sh);

    return 0;

}

展开
收起
爱吃鱼的程序员 2020-05-29 20:13:50 661 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    d 是个数组, 楼主看错了吧,哪来的二维

    struct data { int sh; };

    struct data test[2];

    void change(struct data d[]) { int i = 0; struct data p=NULL; //p=(struct data)malloc(sizeof(struct data));

    for (i = 0; i < 2; i++) {
        printf("step %d\n", i); 
        p=&d[i];
        p->sh=2;
    }   
    

    }

    int main(void) { test[0].sh = 1; test[1].sh = 1;

    change(&test);
    
    printf("%d %d\n", test[0].sh, test[1].sh);
    
    return 0;
    

    }

    这样也可以:

    #include <unistd.h>
    #include <time.h>
    #include <string.h>
    #include <stdlib.h>
    #include <errno.h>
    struct data {
        int sh; 
    };
    
    struct data test[2];
    
    void change(struct data *d) 
    {
        int i = 0;
        //struct data *p=NULL;
        //p=(struct data*)malloc(sizeof(struct data)); 
        for (i = 0; i < 2; i++) {
            printf("step %d\n", i); 
            (d+i)->sh=2;
        }   
    }


    ######

    这个是二维数组,二维数组在作为入参时需要传入第二维维度的,也就说void change(struct data (*d)[2])

    ######方法1 :void change(struct data *d);声明函数, 调用change(test)就可以, 而方法2: void change(struct data **d), 调用change(&test)就不行? 还是不太理解!######是滴,看错了。。应该是数组指针######楼主看错了吧,哪来的二维数组。。。######好久没看这样的问题了,"数组名"我一直理解成一个常量指针,在这段代码里是一个一级的常量指针,定义的时候就系统就已经在静态存储区为它分配好了内存,它自己在内存中的地址和指向的地址都一样,这个指针的指向不能改变。这种情况下,我很少用数组指针去实现(基本没用过),直接传一级指针就好了, void change(struct data *d), 调用的时候用 change(test); ######哦哦, 你是说, struct data test[2] 当中的test是一个一级常量指针, 这个test指针的指向不能改变? 我只是想改变它指向某个地址的值而已哦, 也就是说, 我只想改变test[x],这样做不允许??? 为什么你传一级指针就可以, 而我传二级指针就不行呢void change(struct data **d) ???######

    方法1 :void change(struct data *d);声明函数, 调用change(test)就可以,

    而方法2: void change(struct data **d), 调用change(&test)就不行? 还是不太理解!能否详尽解释一下???

    ######首先下标运算的含义,type a[b],a[c],是*((void*)a c*sizeof(type))######你的意思应该是这样,*((void *)a + c * sizeof(type)), 对吗?######看不懂, 请说详细一点,######你想你这样正确,传入值应该是一个由指向data对象的指针构成的数组,而不是data数组取地址,尽管语法上编译器检查不出错误######a c中间是加号,wp客户端似乎打不出来###### (*d)[i]->sh = 2######先生, 不对哦######

    (*d)[i].sh=2


    ######谢谢,我理解有错######你好, 依然不对哦!######你对下标运算怎么理解的,为什么要用下标######“方便取出某个成员的值”######你好, 我使用下标就是为了方便某个成员的值, 比如第0个我就a[0], 第一个我就取a[1],这样, 由于是二级指针, 所以我也套用指针和数组联系那一个知识点, **a, 那我a[0]就是取出一个成员而已######你这个报段错误是因为你的这种写法是在传入的地址上取第0,4个字节偏移的双字,作为地址寻址赋值,如果传入的是指针数组就是没有问题的,而你这种传入的方式,是以你的数组元素的sh的值取出来作为地址寻址赋值######你有没有想过他是怎么取出值的######谢谢你的耐心回答, 能否推荐一个指针有关的读物给我, 让我深读一下, 或者给格链接。
    2020-05-29 20:13:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Go语言路上踩过的坑 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载