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

yni*_*ous 3 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]));
Run Code Online (Sandbox Code Playgroud)

对我来说似乎没问题,但我有点怀疑,因为如果我这样做,编译器不会抱怨:

struct bar {
    struct foo d;
    int c;
};
Run Code Online (Sandbox Code Playgroud)

Dan*_*her 5

这不好.第6.7.2.1节(在1570年),第3点说

3结构或联合不应包含具有不完整或函数类型的成员(因此,结构不应包含其自身的实例,但可包含指向其自身实例的指针),除了具有更多结构的结构的最后一个成员一个命名成员可能有不完整的数组类型; 这样的结构(以及可能递归地包含这种结构的成员的任何联合)不应是结构的成员或数组的元素.

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

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