这个代码是否由C标准保证?

Bri*_*don 7 c struct

我已经读过如果你声明这样的两个结构:

struct Node {
   int a, b, c;
};

struct DerivedNode {
   struct Node base;
   int d, e, f;
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用指针:

struct DerivedNode myDerivedNode; 
struct Node *regularNode = (struct Node *) &myDerivedNode;

regularNode->a = 3;
Run Code Online (Sandbox Code Playgroud)

换句话说,地址偏移量a, b, cstruct Node和中是相同的struct DerivedNode.所以你可以从中获得一种多态性,在那里你可以传递一个强制(struct Node *)广播的DerivedNode指针,无论在哪里通常都会采用Node指针.

我的问题是这种行为是否得到保证.我知道有一些奇怪的内存对齐问题,编译器有时会重新排序字段以实现更好的内存打包.base除了开始之外,这个领域是否会位于任何地方struct DerivedNode

Dav*_*nan 13

这保证符合标准.结构中的成员按照您指定的顺序按顺序排列,第一个成员始终显示在偏移0处.

ANSI C标准的相关摘录:

结构是由一系列成员组成的类型,其存储以有序序列分配.

这表明成员按顺序排列.

结构对象中可能存在未命名的填充,但不是在其开头.

意味着第一个成员位于偏移0处.

注:标准摘录摘自ISO/IEC 9899:TC3 2007年9月草案第6.7.2.1节.