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

时间:2010-08-04 21:38:25

标签: 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]);
  }
}  

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

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

这是使用GCC。

2 个答案:

答案 0 :(得分:16)

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

来自Wikipedia

  

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

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

答案 1 :(得分:1)

C99支持代码中的任何位置的声明,以及VLA。你使用什么编译器?