参考GCC 的零长度数组解释:
这在结构是可变长度对象的标头的情况下特别有用。这正是我的情况。此外,我关心堆中结构的对齐方式。
在这种情况下,我仍然真的不明白零长度数组有什么用处。它们与这种特殊情况有什么关系?
编辑:
是不是我可以在里面放多少我想要的“数据”?
参考GCC 的零长度数组解释:
这在结构是可变长度对象的标头的情况下特别有用。这正是我的情况。此外,我关心堆中结构的对齐方式。
在这种情况下,我仍然真的不明白零长度数组有什么用处。它们与这种特殊情况有什么关系?
编辑:
是不是我可以在里面放多少我想要的“数据”?
基本上,它允许您在最后拥有一个带有可变长度数组的结构:
struct X {
int first;
int rest[0];
};
数组大小为 0 实际上是无效的(尽管它被允许作为 gcc 扩展)。具有未指定的大小是正确的方法。由于 C 并不真正关心您正在访问数组末尾之外的元素,因此您只需从未定义的数组大小开始,然后分配足够的内存来处理您实际需要的许多元素:
struct X *xp = (struct X *)malloc(sizeof(struct X)+10*sizeof(int));
xp->rest[9] = 0;
从中返回的内存malloc()
将分配给指向具有零长度数组成员的结构的指针,这将是对齐的内存……这是 C99 规范所要求的。因此,将具有零长度数组的结构覆盖在通过malloc()
.
你会遇到麻烦的地方是尝试将你的结构覆盖在内存中的一些原始缓冲区上,这些缓冲区来自打包或非传统对齐的数据源,例如文件头、内存映射硬件接口等。在那些在这种情况下,使用零长度数组来处理可变长度数据可能不是一个好主意,因为数据可能不会根据平台的默认对齐参数对齐,因此偏移到数组中不会产生正确的结果。