typedef struct A
{
int x;
}A;
typedef struct B
{
A a;
int d;
}B;
void fn()
{
B *b;
((A*)b)->x = 10;
}
我在 SO 中阅读了上面的代码片段。((A*)b)->x
不是好的编程风格。b->a.x
是良好的编程风格。因为任何人都会在语句“A a;”之前添加一些内容在结构 b 中,它将不起作用。我不明白为什么?我也尝试过。请问有什么建议吗?
该技巧用于模拟 C 中的继承。它可以将地址 A 或 B 传递给需要指向 A 的指针的函数。
这是可行的,因为 C 保证结构体的第一个成员之前没有填充。因此,如果 A 是 B 的第一个成员,则 B 开头的内存布局始终与 A 相同。
int doStuff(A * a) {
return a->x + 1;
}
...
B b;
doStuff((A*)&b); // Will work because b and b.a have the same start address
如果您要更改 B 声明:
typedef struct B
{
int d;
A a;
}B;
这将不再有效(A*)&b
将返回地址b.d
, not b.a
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)