柔性阵列成员(零长度阵列)

时间:2012-03-22 04:10:27

标签: c arrays struct flexible-array-member

参考GCC's Zero Length Array解释:

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

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

编辑:

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

2 个答案:

答案 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()覆盖从堆分配的内存中的零长度数组覆盖结构没有任何问题。

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