编译时数组的静态内存分配

时间:2014-07-27 09:06:47

标签: c

编译器如何在编译时确定下面数组的大小?

int n;
scanf("%d",&n);
int a[n];

它与动态分配的区别(除了在动态数组的堆中分配内存)。

如果可能的话,请根据激活堆栈内存映像解释这个数组如何分配内存。

2 个答案:

答案 0 :(得分:8)

阵列的大小在编译时没有确定;它是在运行时确定的。在分配数组时,n具有已知值。在程序堆栈上分配自动变量的典型实现中,将调整堆栈指针以为多个整数腾出空间。它成为堆栈框架的一部分,当它超出范围时将自动回收。

此代码在C90中无效; C90要求在块的开头声明所有变量,因此不允许混合声明和这样的代码。 C99中引入了可变长度数组和混合代码和声明。

答案 1 :(得分:1)

在C中,分配类型的正确名称是自动。在计算行话时,术语 stack 有时会同义使用。

a的存储从定义int a[n];开始直到封闭范围的结束(即当前函数的结束或更早)为止。

它与int a[50];相同,只是可以分配比50更多的整数。

使用自动数组(有或没有运行时大小)的缺点是没有可移植的方法来防止堆栈溢出。 (实际上,自动变量的堆栈溢出是C标准根本没有解决的问题,但它在实践中是一个真正的问题。)

如果您要使用动态分配(即malloc和朋友),那么它会通过返回NULL让您知道内存是否不足,而堆栈溢出则是讨厌。