C语言 为什么我得到malloc()分割错误,而使用指针到指针



我不明白为什么会这样:

void main() { 
    int *  b;
    b = (int *)malloc(sizeof(int));
    *b = 1;
    printf("*b = %dn", *b);
}

而这没有(获得malloc()的分段错误):

void main() {
    int ** a;
    int    i;
    for (i = 0; i<= 3; i++) {
        a[i] = (int*)malloc(sizeof(int));
        *(a[i]) = i;
        printf("*a[%d] = %dn", i, *(a[i]));
    }
}

因为我发现a[i]就像第一个例子中的b

BTW, a[i] = *(a+i),对吗?

您需要首先为a分配内存,以便您可以访问a[i]的成员。

所以如果你想分配4个int *,请执行

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

或者定义为整型指针数组

int *a[4];

a是一个二维指针,你必须分配两个维度。B是一个一维指针,你只需要分配一维空间

就是这样做的
b = (int *)malloc(sizeof(int));

那么为了使第二个例子有效你必须为指针的指针分配空间

void main() {
int ** a;
int    i;
a = (int**)malloc(4*sizeof(int*));
for (i = 0; i<= 3; i++) {
    a[i] = (int*)malloc(sizeof(int));
    *(a[i]) = i;
    printf("*a[%d] = %dn", i, *(a[i]));
}

分配的指针被写入未初始化的内存(您从未将a设置为任何值),导致未定义的行为。

所以不,它完全不等同于第一个例子中的代码。

你需要这样写:

int **a;
a = malloc(3 * sizeof *a);

首先,要确保a持有有效的东西,然后你可以使用索引并分配给a[0]

进一步:

a[i] = (int*)malloc(sizeof(int));

没有任何意义。它赋值给a[i],一个类型为int *的对象,但是为sizeof (int)分配空间。

最后,不要在c中强制转换malloc()的返回值。

实际上malloc如果你真的想要安全和可移植,在Linux上,malloc可以为给定的请求返回一个积极的响应,即使实际的内存甚至不是真正为你的程序保留的,或者内存是不可写的。

据我所知,你的两个例子都可能返回一个段错误或简单的崩溃。

我认为malloc是真正的可移植和"安全"的原因。

相关内容

  • 没有找到相关文章

最新更新