使用灵活的数组成员分配struct

Ale*_* C. 7 c c99 flexible-array-member

这是C99代码:

typedef struct expr_t
{
    int n_children; 
    foo data; // Maybe whatever type with unknown alignment
    struct expr_t *children[];
} expr_t;
Run Code Online (Sandbox Code Playgroud)

现在,我该如何分配内存?

expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));
Run Code Online (Sandbox Code Playgroud)

要么

expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *));
Run Code Online (Sandbox Code Playgroud)

sizeof甚至保证与柔性阵列构件的工作类型(GCC接受它)?

Cra*_*sta 8

expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));在C99中有明确的定义.根据C99规范6.7.2.1.16:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这被称为灵活的阵列成员.在大多数情况下,将忽略灵活数组成员.特别地,结构的尺寸好像省略了柔性阵列构件,除了它可以具有比省略意味着更多的拖尾填充.