难以理解C中的可变长度数组

dar*_*dow 3 c arrays declaration

当我发现数组大小必须在声明时给出或者在运行时使用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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常.

我的问题是这段代码是如何正常工作的.不是违反C的基本概念,数组大小必须在运行时之前声明或者在运行时使用malloc()分配它.我不做这两件事中的任何一件,那它为什么它正常工作?

我的问题的解决方案是C99支持的可变长度数组,但是如果我玩我的代码并将语句放入int [n]; 在scanf("%d,&n)之上;然后它停止工作为什么它如此.如果C中支持可变长度数组?

Cha*_*via 5

C99标准支持可变长度数组.这些数组的长度在运行时确定.