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

TymonHuang 发布于 2015/01/26 16:47
阅读 755
收藏 1
#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!!!!

加载中
0
聽雨人
聽雨人

引用来自“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。

lr0822
lr0822
c
TymonHuang
TymonHuang
恩恩, 是的, 我刚开始是这样理解的, p = a[i], p就指向了a[i], 接着 p = malloc(sizeof(int)); 就等于分配内存给a[i]了, 其实这里也错了。
lr0822
lr0822
0
喵星人哦
喵星人哦
a都没初始化,哪来的a[i]??
喵星人哦
喵星人哦
int **a = (int**)malloc(sizeof(int*));
TymonHuang
TymonHuang
a = malloc(sizeof(int*)); *a = malloc(sizeof(int*)); 以上均不行。
0
剑尖血凝紫
剑尖血凝紫
a = malloc(sizeof(int*) * 3); 
0
喵星人哦
喵星人哦
看你要怎样的指针了,如果是要动态分配二维数组,用楼上的方式,如果是要分配一个二级指针,这个指针指向一个一维数组,就int **a = (int**)malloc(sizeof(int*));,这2种方式分配的内存结构是不同的
lr0822
lr0822
其实很简单
0
TymonHuang
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);
    }

0
noqnakhier
noqnakhier

    a = (int **)malloc(sizeof(int *) * 3);
    for (i = 0; i < 3; i++) {
        a[i] =(int *)malloc(sizeof(int));
        *(a[i]) = i;
    }
0
中山野鬼
中山野鬼
既然你都叫做“二级指针”了。也应该知道有两层级的地址存储空间啊。空间声明代码,int **a,只给了一个层级的空间,另一个层级的空间要么静态声明,要么动态申请。哈。
返回顶部
顶部