以下代码是否有效?
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;
};
答案 0 :(得分:5)
不行。第6.7.2.1节(在n1570中),第3点说
3结构或联合不得包含不完整或功能类型的成员(因此, 结构不应包含自身的实例,但可以包含指向实例的指针 它本身),除了具有多个命名成员的结构的最后一个成员 可能有不完整的数组类型;这样的结构(和任何包含的结合,可能 递归地,这种结构的成员不应该是结构的成员或者 数组的元素。
因此,具有灵活数组成员的struct
可能不属于另一个结构。
(如果编译器接受它,它可能作为结构的最后一个成员。)