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

时间:2013-07-09 22:32:19

标签: c c99

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

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

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

3 个答案:

答案 0 :(得分:13)

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

  

6.7.5.2数组声明符

     

...

     

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

答案 1 :(得分:2)

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

  

每次评估[尺寸表达式]时,它应具有大于零的值

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

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

从C11,6.7.21 / 18:

  

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以   有一个不完整的数组类型;这称为灵活的阵列成员。在大多数情况下,   灵活的数组成员被忽略。特别是,结构的大小就像是   省略了灵活的数组成员,除了它可能有更多的尾随填充   遗漏意味着。但是,当.(或->)运算符具有左操作数时   (指向)具有灵活数组成员和右操作数名称的结构   成员,它的行为好像该成员被替换为最长的数组(具有相同的   元素类型)不会使结构大于被访问的对象;

答案 2 :(得分:1)

标准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;