C 在另一个结构中具有灵活数组成员的结构

C 在另一个结构中具有灵活数组成员的结构,c,flexible-array-member,C,Flexible Array Member,下面的代码是否有效 struct foo { int a; int b[]; }; struct bar { int c; struct foo d; }; struct bar *x = malloc(sizeof(struct bar) + sizeof(int [128])); 对我来说似乎没问题,但我有点怀疑,因为如果我这样做,编译器不会抱怨: struct bar { struct foo d; int c; }; 这不好。第6.

下面的代码是否有效

struct foo {
    int a;
    int b[];
};

struct bar {
    int c;
    struct foo d;
};

struct bar *x = malloc(sizeof(struct bar) + sizeof(int [128]));
对我来说似乎没问题,但我有点怀疑,因为如果我这样做,编译器不会抱怨:

struct bar {
    struct foo d;
    int c;
};

这不好。第6.7.2.1节(n1570中),第3点说

3结构或接头不得包含不完整或功能类型的构件(因此, 结构不应包含自身的实例,但可以包含指向实例的指针 除了具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这种结构(以及任何包含 递归地,属于此类结构的构件)不得为结构或结构的构件 数组的元素

因此,具有灵活数组成员的
结构
可能不是另一个结构的一部分


(如果编译器接受它,它很可能作为结构的最后一个成员工作。)

@Shahbaz:No,
intb[]
int*b
不同。此构造称为灵活数组成员@詹姆斯林,我不知道!不过,这似乎是个糟糕的主意。他们怎么能使它成为标准呢?@Shahbaz这不是一个可怕的想法,只是如果人们错误地使用它会很危险。在标准化之前,将长度为1的数组作为
struct
s的最后成员是一种常见的黑客行为。gcc早就接受0长度数组作为灵活的数组成员。