struct中这个`data [0]`声明的目的是什么?

时间:2017-11-18 06:37:00

标签: c arrays structure c99

在C中,灵活数组成员的语法如下:

struct s 
{ 
    int n; 
    double d[];  // flexible array member
};

并且,零大小数组在C中是非法的。

如果我像这样声明数组:

struct s 
{ 
    double d[0];  // Zero size array
};

GCC发出警告:

warning: ISO C forbids zero-size array 'd' [-Wpedantic]

所以,我要回答我的主要问题。

我看到了以下代码here

struct squashfs_xattr_entry {
    __le16          type;
    __le16          size;
    char            data[0];
};

在C零大小数组中非法。

然后,

  • 这个data[0]声明在struct中的目的是什么?
  • data[0]在这做什么?

1 个答案:

答案 0 :(得分:3)

在C99(1999年发布的ISO标准版C)之前,实现灵活数组成员的唯一方法是编译器是否支持它作为扩展。 GCC使用静态长度0支持它,因此foo buffer[0]

C99使其合法,但他们决定规定语法foo buffer[],而不是保留GCC的[0]版本。

GCC仍支持buffer[0]与C99之前编写的代码兼容。

GCC的文档中对此进行了解释:https://gcc.gnu.org/onlinedocs/gcc-4.4.4/gcc/Zero-Length.html(强调我的):

  

GNU C中允许使用零长度数组

请注意" GNU C" (GCC的GCC实现)在ISO C上有自己的扩展。