8

I'm programming in C99 and use variable length arrays in one portion of my code. I know in C89 zero-length arrays are not allowed, but I'm unsure of C99 and variable length arrays.

In short, is the following well defined behavior?

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

3 回答 3

15

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

6.7.5.2 数组声明符

...

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

于 2013-07-09T22:35:07.813 回答
2

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

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

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

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

从 C11,6.7.21/18:

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

于 2013-07-09T22:40:19.123 回答
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;
于 2013-07-11T12:02:07.700 回答