共用体的赋值问题

共用体的赋值问题

2018年11月15日 11:40:58 layandtry 阅读数:55

注:带颜色的文本是转发者添加的内容

共用体的内存虽然有自己的成员变量,但是所有成员变量占用的是同一段内存空间。

对于共同体变量,在某一时间点上只能存储某一成员的信息

#include<stdio.h>
union un
{
    int i;
    char c[2];
};
void main()
{
    union un x;
    x.c[0]=10;//它的赋值本质是在4个字节(因为有int i;语句,已经将i开辟了4个字节的空间)的空间里的左边第一个字节存放整

                    //型数10,即在???? ????  ???? ????  ???? ????  ???? ????的最后一个字节即红色?表示一个字节,赋值为10,

                   //为什么上面的4个字节是问号呢?因为变量i没有赋值,是随机数。当完成x.c[0]后,变成了:

                   //???? ????  ???? ????  ???? ????  0000 1010,
    x.c[1]=1;//此句赋值完后,4个字节的空间变成了:???? ????  ???? ????  0000 0001,  0000 1010,紫色的部分就是本句代码的

                     //作用。因此当访问变量i时,访问的是上面4个字节的值:???? ????  ???? ????  0000 0001,  0000 1010,因为这4                        //个字节中前面的两个 字节没有赋值,所以是不固定的数,也就是随机数,每次访问变量i时,都会出现不一样的数

                   //值。但是每次访问后2个字节的空间时,都不会变化,都是:左边第一个字节的是是10,即x.c[0],第二个字节的值是1,

                    //即x.c[1]的值。所以说在没有给前两个字节赋值为0的情况下,下面运行结果的说法都是不对的。怎样做下面的说法

                     //才正确呢?就是在前面加上一句代码:int i = 0;将最前面的两个字节变为0后,就与下面的说法相符了。
    printf("\n%d",x.i);//
    printf("\n%d",x.c[0]);//结果是10
    printf("\n%d",x.c[1]);//结果是1
}
运行结果是266   10  1

刚开始一脸懵逼,后来带入数值不断的运行之后,

  1.  当x.c[0]=10;  x.c[1]=2;
  运行结果为522=2*256+10

2 .  当x.c[0]=10;  x.c[1]=3;
  运行结果为778=3*256+10

3.  当x.c[0]=10;  x.c[1]=0;
  运行结果为10=0*256+10

4.  当x.c[0]=11;  x.c[1]=1;
  运行结果为10=267

5.  当x.c[0]=12;  x.c[1]=1;
  运行结果为10=268

也就是说,x.c[1]是十六进制的十位(应该是十六进制的百位),x.c[0]是个位。

猜你喜欢

转载自blog.csdn.net/weixin_41632560/article/details/84870452