为什么我在使用指向指针的指针时得到malloc()的分段错误?

时间:2013-05-15 07:24:29

标签: c pointers malloc

我不明白为什么会这样:

void main() { 
    int *  b;
    b = (int *)malloc(sizeof(int));
    *b = 1;
    printf("*b = %d\n", *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] = %d\n", i, *(a[i]));
    }
}

因为我发现a[i]与第一个示例中的b类似。

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

4 个答案:

答案 0 :(得分:3)

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

所以如果你想分配4 int *

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

for (i = 0; i<= 3; i++) {
  ...
}

或将其定义为整数指针数组

int *a[4];

答案 1 :(得分:1)

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] = %d\n", i, *(a[i]));
}

答案 2 :(得分:0)

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

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

您需要以下内容:

int **a;

a = malloc(3 * sizeof *a);

首先,要确保a保留有效内容,然后,您可以使用索引编制并分配给a[0]

此外,这:

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

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

最后,don't cast the return value of malloc() in C

答案 3 :(得分:0)

实际上malloc并不是那么简单,如果你真的想要安全和可移植,在Linux上例如malloc可以为给定的请求返回一个肯定的响应,即使实际的内存它甚至没有真正保留给你的程序或内存它是不可写的

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

@ ruppells-vulture我认为,出于这个原因,malloc非常便携且“安全”。