灵活的arrays成员(零长度arrays)

参考GCC的零长度arrays说明:

当struct是可变长度对象的头时,这尤其有用。 这正是我的情况。 此外,我关心的是我的结构在堆中的对齐。

在这种情况下,我仍然不明白零长度数组有什么用处。 它们与这种特殊情况有什么关系?

编辑:

我可以在那里放置尽可能多的“数据”吗?

基本上它允许你在结尾处有一个带有可变长度数组的结构:

 struct X { int first; int rest[0]; }; 

由于C并不关心您是否正在访问数组末尾之外的元素,因此您只需从大小为零的数组开始,然后分配足够的内存来处理您实际需要的许多元素:

 struct X *xp = (struct X *)malloc(sizeof(struct X)+10*sizeof(int)); xp->rest[9] = 0; 

malloc()返回的malloc() ,你将分配给具有零长度数组成员的结构的指针将是对齐的内存…这是C99规范所要求的。 因此,通过malloc()从堆中分配的内存上覆盖零长度数组的结构是没有问题的。

遇到麻烦的地方是尝试将结构覆盖在内存中的某个原始缓冲区中,该缓冲区来自打包或非传统对齐的数据源,例如文件头,内存映射硬件接口等。例如,使用零长度数组来处理可变长度数据可能是个坏主意,因为数据可能不会根据平台的默认对齐参数进行对齐,因此偏移到数组中将不会产生正确的结果。