当其他成员设置为新值时,C 联合成员给出特定/错误的值。为什么下面的 C 代码会输出这样的结果?

2024-02-24

#include <stdio.h>
int main()
{
  union Data
  {
    char str[20];    
    int i;
    float f;
  }data;

  data.i=20;
  data.f=220.5;
  printf("%d\n",(data.i));

  return 0;
}

输出为:1130135552。我在 Ubuntu 16.04 LTS 上使用 gcc 编译器。

有人可以解释一下输出吗?

成员data.i and data.f占用相同的内存位置,所以输出应该是220。但是为什么输出是1130135552?


正如你已经知道的那样union内部成员之间共享内存位置。的情况下union编译器分配的内存等于成员的最大大小,并为所有成员使用相同的内存。

因此当你执行data.f=220.5;, 之间的共享内存位置i and f保持data.i=20;被覆盖为新值(220.5),二进制表示如下:

现在,当这个值被读取为有符号整数时int它将被解释为不进行转换1130135552以十进制表示。因此你得到1130135552.

此外,如果您想使用 union 的所有成员,那么 struct 就是答案。

struct Data
{
    char str[20];
    int i;
    float f;
} data;

data.i=20;
data.f=220.5;
printf("%d\n",data.i);

For more information on union and struct Please refer the following from Difference between Structure and Union https://www.geeksforgeeks.org/difference-structure-union-c/: enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当其他成员设置为新值时,C 联合成员给出特定/错误的值。为什么下面的 C 代码会输出这样的结果? 的相关文章

随机推荐