繁体   English   中英

C Unions:为什么我会为同一个地址获得两个不同的值?

[英]C Unions: Why am I getting two different values for the same address?

一个相当简单的代码:

#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

两个联盟成员的地址是相同的(应该是这样)。 但这不应该意味着这些地址的值也将相同-似乎并非如此?

谢谢 :)

如果您尝试读取上次写入的联合成员之外的联合成员,则结果定义不明确(除非联合包含具有兼容类型的结构的某些特殊情况)。 标准说:

如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将被重新解释为新类型中的对象表示在 6.2.6 中描述(有时称为“类型双关”的过程)。 这可能是一个陷阱表示。

因此,如果您存储到bar.a ,然后尝试读取bar.b ,它将将该内存的内容重新解释为float 您不会得到相同的值,因为浮点 10 的表示与整数 10 完全不同。

Casting (int)bar.b不会解决问题,因为它会首先将内容解释为float ,然后将其转换为整数。

您可以做的是使用指向成员的指针的转换。 但是,我认为这可能违反了严格的别名规则。

printf("%d %d\n", foo.a, *(int *)&foo.b);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM