#include<stdio.h>
void main(){
int n = 0;
scanf("%d",&n);
int a[n];
printf("Number of elements in array is %ld\n",sizeof(a)/sizeof(int));
}
我已经在上面展示了一种在C中动态分配数组的错误方法。动态分配的正确方法是使用malloc。在数组的当前声明中(由于C的语法),变量&#34; a&#34;应该在编译时分配但不在运行时分配。所以它应该在数据段中。但动态分配的任何东西都在堆中。我有两个问题:
变量&#34; n&#34;必须是一个常数,以便&#34; a&#34;在编译期间在数据段中分配,而不是在运行时分配。该程序编译没有错误。为什么在编译时没有标记错误或至少发出警告?
我执行了这段代码并为n赋予了一个值,但发现为数组分配的元素数量为&#34; a&#34;正是n。这是怎么回事?分配的数组在哪里?
我在ubuntu 16.04中使用gcc编译器5.4.0。
答案 0 :(得分:3)
1
的答案是: -
没有标记错误,因为您的编译器了解C99
代码。这被称为VLA(可变长度阵列)。它自C99以来一直受到支持。 (VLA是C99
特定语言功能)。模式为gnu11
(默认情况下)。
在内部,它也使用了一些分配(使用alloca
等)。
默认情况下,您的编译器以C99
模式运行。检查编译器的选项以切换到严格C89
或其他模式。你会收到一个错误。
第二个问题的答案非常明显,因为您指定的数组大小为n
而不是n-1
或n+1
。所以它为你分配了大量的内存。