声明一个负长度数组

时间:2010-09-23 23:48:16

标签: c arrays gcc c99

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

例如:

int n = -35;

int testArray[n];

for(int i = 0; i < 10; i++)
    testArray[i]=i+1;

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

3 个答案:

答案 0 :(得分:20)

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

C99§6.7.5.2:

  

如果大小是表达式   不是整数常量表达式......   ......每次评估时都应该   值大于零。

答案 1 :(得分:3)

我相信未定义的行为,但请不要引用我。

这会在gcc:

中出现错误error: size of array 'testArray' is negative
int testArray[-35];
但是,如你所见:

int n = -35;
int testArray[n];
即使同时使用-Wall和-W,

也不会出错。

但是,如果使用-pedantic标志,gcc将警告ISO C90禁止可变长度数组。

答案 2 :(得分:0)

compilation的Visual Studio错误消息,您可以使用-1来表示空数组。它期望int并且你传递int,所以没有编译器错误。