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