2

C11,6.7.2.1 结构和联合说明符,约束,3(强调添加):

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

C 的基本原理,修订版 5.10,2003 年 4 月(强调添加):

同样,包含灵活数组的结构不能出现在其他结构或数组中。

因此,C 的基本原理并没有提供基本原理。理由是什么?

4

1 回答 1

3

具有灵活数组成员的结构只有在动态分配时才能真正正确使用。例如:

struct s1 {
    int a;
    int b;
    int c[];
};
...
struct s1 *x = malloc(sizeof(struct s1) + 5 * sizeof(int));

让我们假设典型的结构填充和sizeof(int)==4. 那会让sizeof(struct s1)==8.

现在想象如果这样的结构是另一个结构的成员:

struct s2 {
    int a;
    struct s1 b;
    int c;
};

b成员struct s2将从偏移量 4 开始。但是c成员呢?鉴于此sizeof(struct s1)==8,这将使成员c具有偏移量 12。但是,该b成员无法为其包含的成员留出任何空间c

因为给定结构成员的偏移量是在编译时设置的,所以无法cstruct s1.

理论上,如果具有灵活数组成员的结构是最后一个成员:

struct s2 {
    int a;
    int b;
    struct s1 c;
};

然后它可以工作,但随后意味着它struct s2也受到与具有灵活数组成员的结构相同的规则,从而导致级联效应。这将使确定哪些结构受此规则约束变得更加困难。

因此,具有灵活数组成员的结构不允许作为另一个结构或数组的成员。

于 2022-02-07T13:25:38.290 回答