为什么不能重新分配已完全初始化的数组?

时间:2019-12-12 22:26:49

标签: c arrays malloc realloc

看看下面的代码。通过 malloc 为其分配空间来创建阵列时,我始终可以调整阵列的大小而不会丢失数据。但是,当我使用int test2[] = {3};完全初始化数组来创建数组时,我无法重新分配。这是为什么?这只是一个愚蠢的例子,但它提出了我正面临的问题。

我尝试以不同的方式(*,&,**等)引用 test2 ,但在某个时候,我发现自己只是希望在不知道自己正在做什么的情况下神奇地找到解决方案。 / p>

我一直在搜索很多东西,但似乎找不到适当的解释来解决这个问题或解决方案。

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int *test1 = malloc(1 * sizeof(int));
    test1[0] = 1;
    test1 = realloc(test1, 2 * sizeof(int));
    test1[1] = 2;

    for(int i = 0; i < 2; i++)
    {
        printf("%d\n", test1[i]);
    }

    int test2[] = {3};
    test2 = realloc(test2, 2 * sizeof(int));
    test2[1] = 4;

    for(int i = 0; i < 2; i++)
    {
        printf("%d\n", test2[i]);
    }
}

输出:

test.c: In function 'main':
test.c:17:8: error: assignment to expression with array type
  test2 = realloc(test2, 2 * sizeof(int));

当我在第一个for循环之后删除代码时,该程序将按预期进行编译并很好地执行。

1 个答案:

答案 0 :(得分:4)

声明int test2[] = {3};不会创建可以稍后释放或重新分配的内存!相反,它定义了一个 固定 长度的数组,很可能是在堆栈上“创建”的。

另一方面,对malloc的调用从 heap 中分配了请求的内存量(实际上,正在运行的程序可以使用大量内存);稍后可以使用realloc来调整此内存“块”的大小,并通过调用free必须释放(完成后)。