声明一个负长度数组

jon*_*gan 15 c arrays gcc c99

在创建负长度数组时,C中会发生什么?

例如:

int n = -35;

int testArray[n];

for(int i = 0; i < 10; i++)
    testArray[i]=i+1;
Run Code Online (Sandbox Code Playgroud)

此代码将编译(并且在启用-Wall时不会显示任何警告),并且您似乎可以testArray[0]毫无问题地分配.分配过去会产生段错误或非法指令错误,并从数组中读取任何内容称"中止陷阱"(我不熟悉那个).我意识到这有点学术性,并且(希望)永远不会出现在现实生活中,但C标准是否有任何特定的方式来对待这样的数组,或者它是否因编译器而异?

caf*_*caf 21

它是未定义的行为,因为它打破了"应该"约束:

C99§6.7.5.2:

如果size是一个不是整数常量表达式的表达式......每次计算它时,它的值应大于零.

  • +1,完全是答案.但我发现编译器还不能对这种代码进行静态分析并发出至少一个警告,这令人非常失望.我还测试了`clang`和`-analyse`,而不是更好. (2认同)