零长度的数组在GNU C里是合法的。这是个非常有用的技巧,如果把一个结构体的最后一个元素当成一个变长的对象头地址:
struct line
{
int length;
char contents[0];
}
struct line *thisline = (struct line*)malloc(sizeof(struct line) + this_length);
thisline->length = this_length;
在ISO C90标准里,你必须给contents指定一个1的长度,这意味着你浪费了空间,又把malloc的参数给复杂化了。
在ISO C99标准里,你可以使用一个柔性数组成员,它在语法和语义有都有细微的差别:
- 柔性数组成员必须写成
contents[]
,没有0
。 - 柔性数组成员是不完整的类型,所以不支持
sizeof
操作符。 最原始的柔性数组的sizeof实现是给定为零。 - 柔性数组成员只能出现在
struct
的元素的最后一个。 - 一个包含柔性数组成员的
struct
或一个包含这样的struct
的union
(或者是递归形式),是不允许成为一个结构的成员或一个数组的元素的。(然而,这些用法在GCC扩展语法里是合法的)。
GCC-3.0以下的版本是允许零长度数组被静态初始化的,柔性数组也是一样的。