是否允许/定义零长度可变长度数组?

我在C99编程并在我的代码的一部分中使用可变长度数组。 我知道在C89中不允许使用零长度数组,但我不确定C99和可变长度数组。

简而言之,以下是明确定义的行为吗?

int main() { int i = 0; char array[i]; return 0; } 

不,C语言明确禁止零长度数组,即使它们是通过运行时大小值创建为VLA(如代码示例中所示)。

6.7.5.2数组声明符

5如果size是一个不是整数常量表达式的表达式:如果它出现在函数原型范围的声明中,则将其视为*被替换为*; 否则,每次评估它时,其值应大于零

C中不允许零长度数组。静态类型数组必须具有固定的非零大小,这是一个常量表达式,而变长数组必须具有一个非零的大小; C11 6.7.6.2/5:

每次评估[大小表达式]时,它的值应大于零

但是,C99和C11具有结构的灵活数组成员的概念:

 struct foo { int a; int data[]; }; 

从C11,6.7.21 / 18:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这称为灵活的arrays成员 。 在大多数情况下,忽略灵活的数组成员。 特别地,结构的尺寸好像省略了柔性arrays构件,除了它可以具有比遗漏所暗示的更多的拖尾填充。 但是,当一个. (或-> )运算符有一个左操作数,它是一个带有灵活数组成员的结构(指针),右操作数命名该成员,它的行为就好像该成员被最长的数组替换(具有相同的元素类型) )不会使结构大于被访问的对象;

标准C中不允许使用零长度数组(甚至不是C99或C11)。 但是gcc确实提供了允许它的扩展。 请参阅http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

  struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length;