此代码是否由C标准保证?

此代码是否由C标准保证?,c,struct,C,Struct,我已经读到,如果您声明两个结构,如下所示: 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; 然后您可以像这样使

我已经读到,如果您声明两个结构,如下所示:

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;
然后您可以像这样使用指向它们的指针:

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
struct DerivedNode
中是相同的。因此,您可以从中获得一种多态性,在这种多态性中,您可以在通常使用节点指针的任何位置强制传递
(struct Node*)
-cast-DerivedNode指针


我的问题是这种行为是否有保证。我知道存在一些奇怪的内存对齐问题,编译器有时会重新排序字段以实现更好的内存打包。
base
字段是否会位于除
struct-DerivedNode
开头以外的任何位置?

这是标准保证的。结构中的成员将按指定的顺序依次排列,并且第一个成员始终显示在偏移量0处

ANSI C标准的相关摘录:

结构是由一系列成员组成的类型,这些成员的存储是按顺序分配的

这说明各成员是按顺序排列的

结构对象中可能有未命名的填充,但在其开头可能没有

这意味着第一个杆件放置在偏移量0处


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

如David所述,只要
base
仍然是
DerivedNode
中的第一个元素,这一点就可以得到保证

但一般来说,这是一种不好的做法。我想不出有多少情况下你不能说

struct Node *regularNode = &myDerivNode.base;

如果你以后修改你的结构,它会更清晰,更不容易出错。

这不会回答你的问题,但是一个想写标准ANSI(ISO)C的人可以用
gcc-pedantic
-pedantic errors
编译他的代码。这些选项应在非标准代码行上引发编译警告/错误

请注意,这不是100%有效的,因为:

[-pedantic]发现了一些非ISO实践,但不是全部——只有针对 哪个ISO C需要诊断,而其他一些ISO C需要诊断 已添加诊断


你在好几个地方忘记了
struct
关键字,不是吗?@Jens哦,可能是的。对不起,情况是我在一个data structures类中,我被困在1975年的二进制搜索的一个分支中P