c - 描述一下这个 union 正在发生的事情

标签 c struct unions

一位 friend 向我展示了他在类里面必须做的多项选择题练习,他知道正确的答案是什么,但他并不真正理解给定代码中发生的原因或情况。

这是(假设我输入时没有任何错误):

What does the following code display ?

typedef union{
  long adr;
  struct{
     unsigned char a,b,c,d,e;
  }x;
}Ip;
static Ip y;
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
       y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);
y.adr=1234567890;
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
       y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);
y.x.a='A';y.x.b='B';y.x.c='C';y.x.d='D';y.x.e='E';
printf("%l2ld | %02X.%02X.%02X.%02X.%02X\n",
       y.adr,y.x.a,y.x.b,y.x.c,y.x.d,y.x.e);

Answers (?? means a random value) :

A)
         0 | 00.00.00.00.00
1234567890 | 00.00.00.00.00
1234567890 | 41.42.43.44.45

B)
         0 | 00.00.00.00.00
1234567890 | ??.??.??.??.??
?????????? | 41.42.43.44.45

C)
?????????? | ??.??.??.??.??
1234567890 | ??.??.??.??.??
1234567890 | 41.42.43.44.45

D) Something else

现在,他得到了正确答案,即 B,但他不明白为什么,并说他本以为 C 是正确的答案。不幸的是我也不确定这里发生了什么。有人可以给我们详细解释这段代码的作用并帮助我们理解答案吗?提前致谢!

最佳答案

说实话,我认为这是一个误导性的问题。变量被声明为 static 的事实就是其初始值为 0 的原因。静态变量在运行时被初始化为 0。这就消除了 C。

答案的问题(是什么让我挠头一阵子)是 B 中的 ? 不是随机数。它们完全由 adr 或 a-e 中存储的内容决定。如果你不明白它们来自哪里,它们看起来就像是胡言乱语。

在 union 中,变量都共享内存中相同的地址空间。在这种情况下,adr 和 struct x 共享内存空间。因此,当您更改其中一个值时,另一个值也会更改。

因此,如果将 adr 设置为 1234567890,则也会设置 a 到 e 的值。它们将是与代表 adr 的 long 部分对齐的任何字节。

同样,如果您设置 a-e 它会“破坏” adr 的值并更改显示内容。

关于c - 描述一下这个 union 正在发生的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33552380/

相关文章:

c - 即使使用 exit(),程序读取行时也会出现 3 次内存泄漏

c - 我应该如何释放使用多次重新分配创建的所有内存?

c# - 为什么.NET 的 Version 是类而不是结构?

c++ - Union 在内存中的存储

typescript - TypeScript 中关联对象数组的接口(interface)

c - 当 union 位于 c 结构体内部时,sizeof() 将返回什么?

c - 使用管道写入和读取 Int 数组

c - 我如何在 UEFI 驱动程序中设置固件环境变量

c - 如何在c中对结构体数组进行malloc

c - 指向结构体的指针,这还是指向结构体的指针吗?