使用灵活的数组成员分配struct
这是C99代码:
typedef struct expr_t { int n_children; foo data; // Maybe whatever type with unknown alignment struct expr_t *children[]; } expr_t;
现在,我该如何分配内存?
expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));
要么
expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *));
?
sizeof
甚至可以保证在具有灵活arrays成员的类型上工作(GCC接受它)吗?
expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));
在C99中有明确的定义。 根据C99规范6.7.2.1.16:
作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这称为灵活的arrays成员。 在大多数情况下,忽略灵活的数组成员。 特别地,结构的尺寸好像省略了柔性arrays构件,除了它可以具有比遗漏所暗示的更多的拖尾填充。
如果编译器接受具有灵活数组成员的结构的声明,则该结构的sizeof
运算符应该产生结构的大小,就好像灵活数组成员不存在一样。
这种结构的正确分配是:
expr_t *e = malloc (sizeof(expr_t) + n * sizeof(struct expr_t *));
即使编译器不支持灵活的数组成员,您仍然可以执行此操作。 只需将结构的数组成员声明为大小为1
,然后分配n - 1
项而不是n
。