gpt4 book ai didi

c - "structure with flexible array member shall not be a member of a structure"的基本原理是什么?

转载 作者:行者123 更新时间:2023-12-05 02:33:19 27 4
gpt4 key购买 nike

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

A structure or union shall not contain a member with incomplete or function type (hence,a structure shall not contain an instance of itself, but may contain a pointer to an instanceof itself), except that the last member of a structure with more than one named membermay have incomplete array type; such a structure (and any union containing, possiblyrecursively, a member that is such a structure) shall not be a member of a structure or anelement of an array.

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

Similarly, structures containing flexible arrays can’t occur in other structures or in arrays.

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

最佳答案

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

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

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

因为给定结构成员的偏移量是在编译时设置的,所以无法为 struct s1 内部的灵活数组成员 c 分配空间。

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

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

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

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

关于c - "structure with flexible array member shall not be a member of a structure"的基本原理是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71019257/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com