Asignación de estructura con miembro de matriz flexible

Este es el código C99:

typedef struct expr_t
{
    int n_children; 
    foo data; // Maybe whatever type with unknown alignment
    struct expr_t *children[];
} expr_t;

Ahora, ¿cómo asigno memoria?

expr_t *e = malloc (sizeof (expr_t) + n * sizeof (expr_t *));

o

expr_t *e = malloc (offsetof (expr_t, children) + n * sizeof (expr_t *));

?

Essizeof incluso se garantiza que funcionará en un tipo con miembro de matriz flexible (GCC lo acepta)?

Respuestas a la pregunta(2)

Su respuesta a la pregunta