长度为零的数组

零长度的数组在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或一个包含这样的structunion(或者是递归形式),是不允许成为一个结构的成员或一个数组的元素的。(然而,这些用法在GCC扩展语法里是合法的)。

GCC-3.0以下的版本是允许零长度数组被静态初始化的,柔性数组也是一样的。