h-b-z-d-j-s-m 发表于 2022-10-9 19:33:36

共用体

%5Burl=https://imgse.com/i/xYiQmR%5Dhttps://s1.ax1x.com/2022/10/09/xYiQmR.jpg
为什么a,b是跟x共用的一个内存,而不是跟y共用的

jackz007 发表于 2022-10-10 09:09:00

本帖最后由 jackz007 于 2022-10-10 21:26 编辑

      因为 in 和 a、b 共享内存,而在 in 中,x 靠前,占前 4 个字节,y 靠后,占后 4 个字节,而 e 的另两个成员 a 和 b 占用的也同样是 4 个字节,所以,e . a 和 e . b 以及 e . in . x 实际上构成了共享关系。

      关于共用体 e 有以下几点需要明确:

1、e 中共有 3 个成员 in、a、b 共同分享内存,也就是说,这 3 个变量共享同一块内存,但是,in 是结构体,共有 2 个成员(x ,y),都是 int 型,而另外 2 个联合成员 a 和 b 也是 int 型,所以,in 、a、b 的内存共享实际上是 e . in . x、a、b 的内存共享,也就是说,这三个变量实质上就是同一个变量,而且,它们的类型相同,都是 int 型,所以,任何时候都有 e . in . x == e . a == e . b ;

2、在联合 e 的 3 个成员 in 、a、b 中,in 占用了 8 个字节,a 和 b 都是 4 个字节,所以,in 决定了整个共用体的占用空间。

3、既然 e . in . x、e . a、e . b 共享占用了联合体 e 的前 4 个字节,那么,毫无疑问,e . in . y 就 "独占" 了联合体 e 的后 4 个字节,之所以说 "独占",是因为与其它的成员不存在任何关联。

#include <stdio.h>

int main(void)
{
      union EXAMPLE {
                struct {
                        int x                         ;
                        int y                         ;
                } in                                  ;
                int a                                 ;
                int b                                 ;
      } e                                           ;
      e . a = 1                                     ; // e . in . x = e . a = e . b = 1
      e . b = 2                                     ; // e . in . x = e . a = e . b = 2
      e . in . x = e . a * e . b                  ; // e . in . x = e . a * e . b = 2 * 2 = 4
      e . in . y = e . a + e . b                  ; // e . in . y = e . a + e . b = 4 + 4 = 8
      printf("%d , %d\n" , e . in . x , e . in . y) ; // 打印输出 4 , 8
}

howzyao 发表于 2022-10-11 10:41:26

看了以上打印结果,
是不是可以理解为
e.a
e.b
实际上就是同一个数?无论对a还是b赋一个值,另外一个,就变成一样的数?

没有看此贴之前,个人的理解是a,b是各自的值。
页: [1]
查看完整版本: 共用体