我读过,如果你声明两个这样的结构:
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
然后你可以像这样使用指向它们的指针:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
换句话说,地址偏移量为a, b, c
内相同struct Node
and struct DerivedNode
。所以你可以从中得到一种多态性,你可以在其中强制传递一个(struct Node *)
-cast DerivedNode 指针,无论通常采用 Node 指针的地方。
我的问题是这种行为是否得到保证。我知道存在一些奇怪的内存对齐问题,并且编译器有时会重新排序字段以实现更好的内存打包。会不会base
字段可以位于除开头之外的任何地方struct DerivedNode
?
这保证可以按标准工作。结构中的成员按照您指定的顺序依次排列,并且第一个成员始终出现在偏移量 0 处。
ANSI C 标准的相关摘录:
结构体是由一系列成员组成的类型,其存储按有序序列分配。
这表明成员是按顺序排列的。
结构对象内可能有未命名的填充,但不是在其开头。
这意味着第一个成员放置在偏移量 0 处。
Note:标准摘录自 ISO/IEC 9899:TC3 2007 年 9 月草案第 6.7.2.1 节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)