如何解决C联合:为什么我为同一个地址得到两个不同的值?
一个相当简单的代码:
#include <stdio.h>
union foo {
int a;
float b;
};
int main() {
union foo bar;
bar.a = 10;
printf("Addresses: %p %p\n",&(bar.a),&(bar.b));
printf("Values: %d %f\n",bar.a,bar.b);
return 0;
}
结果:
Addresses: 0x7ffe8eda48a4 0x7ffe8eda48a4
Values: 10 0.000000
两个工会会员的地址相同(应该如此)。但这是否不意味着这些地址上的值也将相同-情况似乎并非如此?
谢谢:)
解决方法
如果您尝试读取除上一次编写的工会成员以外的工会成员,则结果的定义不明确(在某些特殊情况下,工会包含具有兼容类型的结构)。 standard说:
如果用于读取联合对象的内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将重新解释为对象中的对象表示。 6.2.6中描述的新类型(有时称为“类型调整”的过程)。这可能是陷阱的表示。
因此,如果您存储到bar.a
中,然后尝试读取bar.b
,它将把该内存的内容重新解释为float
。您不会获得相同的值,因为浮点数10的表示与整数10完全不同。
强制转换(int)bar.b
并不能解决问题,因为它将首先将内容解释为float
,然后将其转换为整数。
您可以做的是使用指向该成员的指针的转换。但是,我认为这可能违反严格的别名规则。
printf("%d %d\n",foo.a,*(int *)&foo.b);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。