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

时间:2012-05-10 20:54:00

标签: 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;
};

1 个答案:

答案 0 :(得分:5)

不行。第6.7.2.1节(在n1570中),第3点说

  

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

因此,具有灵活数组成员的struct可能不属于另一个结构。

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