声明一个负长度数组

当你创建一个负长度数组时,C会发生什么?

例如:

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

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

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

C99§6.7.5.2:

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

我相信,未定义的行为虽然不引用我。

这给出了错误error: size of array 'testArray' is negative在gcc中error: size of array 'testArray' is negative的:

 int testArray[-35]; 

但是,正如你所见:

 int n = -35; int testArray[n]; 

即使同时使用-Wall和-W也不会出错。

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

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