这个C代码应该会失败,但它可以工作.这是为什么?

And*_*zia 4 c gcc

伙计们,我想我会抛弃我所有适度的C绝杀.看看这段代码:

int main(int argc, char** argv, char** envp)
{
  int aa;

  srand(time(NULL));

  int Num = rand()%20;

  int Vetor[Num];

  for (aa = 0; aa < Num; aa++)
  {
    Vetor[aa] = rand()%40;
    printf("Vetor [%d] = %d\n", aa, Vetor[aa]);
  }
}  
Run Code Online (Sandbox Code Playgroud)

我认为这应该抛出一个错误有两个原因 - 首先我在执行命令(srand)后声明Num和Vetor,第二个因为我根据Num声明Vetor,这应该不可能吗?因为那些数组大小不应该在运行时决定,而是在编译时呢?

我真的很惊讶他的作品,如果你们能解释为什么我能真正使用这样的东西会很棒.

这是使用GCC.

Kea*_*eks 16

这些是C99功能,似乎您的编译器支持它们.就这样 ;)

来自维基百科:

C99引入了几个新功能,其中许多功能已在多个编译器中实现为扩展:

  • 内联函数
  • 混合声明和代码,变量声明不再局限于文件范围或复合语句的开头(块)
  • 几种新的数据类型,包括long long int,可选的扩展整数类型,显式布尔数据类型和表示复数的复杂类型
  • 可变长度数组
  • 支持以//开头的单行注释,如BCPL或C++
  • 新的库函数,例如snprintf
  • 等(更多)