我在阅读一本书时发现,在声明数组时必须给出大小,或者在运行时使用malloc从堆中分配。我用C语言编写了这个程序:
#include<stdio.h>
int main() {
int n, i;
scanf("%d", &n);
int a[n];
for (i=0; i<n; i++) {
scanf("%d", &a[i]);
}
for (i=0; i<n; i++) {
printf("%d ", a[i]);
}
return 0;
}
这段代码运行良好。
我的问题是,这段代码如何能够正确地工作。它不违反C语言的基本概念吗?即数组大小必须在运行时之前声明或使用malloc()进行分配。我没有做这两件事情中的任何一件,那么为什么它可以正常工作?
解决我的问题的方法是变长数组,在C99中支持。但如果我在scanf("%d,&n);之前放置语句int a[n];,那么它就停止工作了。为什么会这样呢?如果变长数组在C中得到支持,为什么会发生这种情况?