编译器如何在编译时确定下面数组的大小?
int n;
scanf("%d",&n);
int a[n];
它与动态分配的区别(除了在动态数组的堆中分配内存)。
如果可能的话,请根据激活堆栈内存映像解释这个数组如何分配内存。
答案 0 :(得分:8)
阵列的大小在编译时没有确定;它是在运行时确定的。在分配数组时,n
具有已知值。在程序堆栈上分配自动变量的典型实现中,将调整堆栈指针以为多个整数腾出空间。它成为堆栈框架的一部分,当它超出范围时将自动回收。
此代码在C90中无效; C90要求在块的开头声明所有变量,因此不允许混合声明和这样的代码。 C99中引入了可变长度数组和混合代码和声明。
答案 1 :(得分:1)
在C中,分配类型的正确名称是自动。在计算行话时,术语 stack 有时会同义使用。
a
的存储从定义int a[n];
开始直到封闭范围的结束(即当前函数的结束或更早)为止。
它与int a[50];
相同,只是可以分配比50
更多的整数。
使用自动数组(有或没有运行时大小)的缺点是没有可移植的方法来防止堆栈溢出。 (实际上,自动变量的堆栈溢出是C标准根本没有解决的问题,但它在实践中是一个真正的问题。)
如果您要使用动态分配(即malloc
和朋友),那么它会通过返回NULL
让您知道内存是否不足,而堆栈溢出则是讨厌。