开发者社区 问答 正文

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

看似简单的C语言二级指针怎么那么难?? 400 报错 #include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(void)
{
    int *p;
    int **a;
    int i;

    for (i = 0; i < 3; i++) {
        a[i] = malloc(sizeof(int));
        *(a[i]) = i;
    }

    for (i = 0; i < 3; i++) {
        p = a[i];
        printf("%d\n", *p);
    }

    return 0;

}



以上代码, 就是出错, 请问为什么?? segmant fault!!!!

展开
收起
爱吃鱼的程序员 2020-05-29 20:14:03 524 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    引用来自“TymonHuang”的评论

    改成这样了也不行,

        int *p;
        int **a;
        int i;

        a = malloc(sizeof(int *) * 3);
        for (i = 0; i < 3; i++) {
            p = a[i];
            p = malloc(sizeof(int));
            *p = i;
        }

        int v;
        for (i = 0; i < 3; i++) {
            p = (a[i]);
            v = (*p);
            printf("%d\n", v);
        }

    p = a[i];
    这个时候a[i]并没有分配内存。现在a占着3个int*的内存,但是int*指向哪里并没有分配。所以不能赋值给p。

    ######c######恩恩, 是的, 我刚开始是这样理解的, p = a[i], p就指向了a[i], 接着 p = malloc(sizeof(int)); 就等于分配内存给a[i]了, 其实这里也错了。######恩######a都没初始化,哪来的a[i]??######int **a = (int**)malloc(sizeof(int*));######a = malloc(sizeof(int*)); *a = malloc(sizeof(int*)); 以上均不行。###### a = malloc(sizeof(int*) * 3); ######看你要怎样的指针了,如果是要动态分配二维数组,用楼上的方式,如果是要分配一个二级指针,这个指针指向一个一维数组,就 int **a = (int**)malloc(sizeof(int*));,这2种方式分配的内存结构是不同的######其实很简单######

    改成这样了也不行,

        int *p;
        int **a;
        int i;

        a = malloc(sizeof(int *) * 3);
        for (i = 0; i < 3; i++) {
            p = a[i];
            p = malloc(sizeof(int));
            *p = i;
        }

        int v;
        for (i = 0; i < 3; i++) {
            p = (a[i]);
            v = (*p);
            printf("%d\n", v);
        }

    ######
        a = (int **)malloc(sizeof(int *) * 3);
        for (i = 0; i < 3; i++) {
            a[i]  =(int *)malloc(sizeof(int));
            *(a[i]) = i;
        }
    ######既然你都叫做“二级指针”了。也应该知道有两层级的地址存储空间啊。空间声明代码,int **a,只给了一个层级的空间,另一个层级的空间要么静态声明,要么动态申请。哈。
    2020-05-29 20:14:04
    赞同 展开评论