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

标签 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] 在结构中声明的目的是什么?
  • data[0] 在这里做什么?

最佳答案

在 C99(1999 年发布的 C 的 ISO 标准版本)之前,实现灵活数组成员的唯一方法是编译器是否支持它作为扩展。 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 (强调我的):

Zero-length arrays are allowed in GNU C

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

关于c - struct 中这个 `data[0]` 声明的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47363291/

相关文章:

c++ - C/C++ 中对位数组的两种操作

c++ - float 大小的计算成本

c - 数组与不同类型变量的相等性

java - 从左下角填充 gridview

structure - 从 WebGl 中的代码访问顶点着色器中的结构

c - C 中的反转数函数

c - 运行一个简单的 libpcap 示例时出错

javascript - 在 javascript 中,从迭代器创建数组

c++ - 在 trie 实现中计算单词

c - 为结构指针分配内存