Union的使用

  首先,long long ago之前还是一个刚刚学习c语言的小萌新的时候就已经接触过Union这个关键字了。

  为什么现在又把这个东西捡起来了呢?

  最近在看CsApp,看到了这一题:

 

  答案如下面所示:

答:

A

    e1.p的偏移量等于0

    e1.y的偏移量等于8

    e2.x的偏移量等于0

    e2.next的偏移量等于8

B

    16bytes

C

void proc(union ele *up)

{

    up->x = *(up->e2.next->e1.p) - up->e2.next->e1.y;

}

   首先关注的是偏移量的地方。为什么Union在内存中的存储格式(各成员变量的偏移量)是这样的呢?

   好像是像下面这样的:

  在结构(struct)中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。

  而在“联合”(Union)中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。每次对于union当中的任意一个成员赋值的时候,都会覆盖这段共享空间之前所有的值。

  看一下下面的这段代码就能很清楚了:

  

#include <stdio.h>
void main()
{
        union number
        {                   /*定义一个联合*/
                int i;
                struct
                {             /*在联合中定义一个结构*/
                        char first;
                        char second;
                }half;
        }num;
        num.i=0x4241;         /*联合成员赋值*/
        printf("%c%c\n", num.half.first, num.half.second);
        num.half.first='a';   /*联合中结构成员赋值*/
        num.half.second='b';
        printf("%x\n", num.i);
        getchar();
}
    输出结果为:
     AB
     6261

  这段代码讲的很明白了。

  所以不难明白原题第一题,第二题是怎么回事。

 

  还有一个问题,第三题,如何确定访问的是union内部的e1还是e2呢?
  暂时不清楚,最终的结果是*up=(((up+8)))-((up+8)+8)

  那么只能是访问没有歧义的那个了,需要作为地址访问的时候访问的就是指针(刚好在这道题目的设计当中,前后两个struct,数值和指针错位开来了

posted @ 2021-11-04 17:47  TheDa  阅读(132)  评论(0编辑  收藏  举报