0

我不明白为什么会这样:

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在第一个例子中一样。

顺便说一句,a[i]等于*(a+i),对吧?

4

4 回答 4

3

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

所以如果你想分配 4int *

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

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

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

int *a[4];
于 2013-05-15T07:27:36.563 回答
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]));
}
于 2013-05-15T07:34:17.257 回答
0

分配的指针被写入未初始化的内存(你永远不会设置a任何东西),导致未定义的行为。

所以不,它根本不等同于第一个示例中的代码。

你需要类似的东西:

int **a;

a = malloc(3 * sizeof *a);

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

此外,这:

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

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

最后,不要强制转换malloc()in C的返回值。

于 2013-05-15T07:26:34.480 回答
0

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

据我所知,您的两个示例都可能返回段错误或简单地崩溃。

@ruppells-vulture 出于这个原因,我认为 malloc 是真正可移植且“安全”的。

于 2013-05-15T07:33:01.203 回答