在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]
在这做什么?答案 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上有自己的扩展。