本质上,如果我有
typedef struct {
int x;
int y;
} A;
typedef struct {
int h;
int k;
} B;
我有A a
,C 标准是否保证((B*)&a)->k
是相同的a.y
?
具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?
几乎是的。对我来说足够近了。
来自 n1516,第 6.5.2.3 节,第 6 段:
...如果联合包含多个共享公共初始序列的结构...,并且如果联合对象当前包含这些结构之一,则允许在声明该结构的任何位置检查其中任何结构的公共初始部分联合体的完整类型可见。两个结构共享一个共同初始序列如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(对于位字段,具有相同的宽度)。
这意味着如果您有以下代码:
struct a {
int x;
int y;
};
struct b {
int h;
int k;
};
union {
struct a a;
struct b b;
} u;
如果您分配给u.a
,标准说你可以从u.b
。它扩大了合理性的范围,表明struct a
and struct b
考虑到这一要求,可以有不同的布局。这样的系统将是极端病态的。
请记住,该标准还保证:
然而,这很重要!
你重新表述了这个问题,
C 标准是否保证((B*)&a)->k
与 a.y 相同吗?
不!而且它非常明确地表明它们不一样!
struct a { int x; };
struct b { int x; };
int test(int value)
{
struct a a;
a.x = value;
return ((struct b *) &a)->x;
}
这是一种别名违规行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)