3

下面的代码是否有效?

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;
};
4

1 回答 1

5

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

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

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

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

于 2012-05-10T21:04:47.953 回答