Union联合体

一. union的声明和struct类似

1 union 名称 {
2     //成员变量
3 };
4 
5 typedef union {
6     //成员变量
7 }名字;

  

二. 内存分配

1. union内存大小需要满足以下2个条件:

  1> 大于或等于union中最长的成员变量的长度;

  2> 能整除其他成员变量长度

文字描述计算过程:U001中的成员变量 int number->4字节,char c[10]->10字节,double tmp->8字节,  要大于或等于10,还需要能整除4和8,U001的大小为16字节

 

2. union中的成员变量是不共存的,所有成员变量的起始地址相对于union基地址偏移量都是0,即union创建时分配的内存空间,所有的成员变量共用,新值会覆盖旧值

 

3. 判断union起始地址是低地址还是高地址

从Log可以看出c[0]地址小于c[1],所以在我的机子上,union起始地址是低地址,即小端little-endian

4. union怎么存储和读取成员变量的值

ASCII字符‘A’对应16进制41、10进制65,‘B’对应16进制42、10进制66,'C'对应16进制43、10进制67, 'D'对应16进制44、10进制68

char类型1个字节,int4个字节,给联合体实例u1的成员变量char c[10]前4个字节赋值,正好对应int的4个字节,

以16进制形式打印u1.number可以得到44434241,说明union的存取是这个样子的:

  4-1> 创建出联合体实例u1后,u1的内存如下

  4-2> 赋值u1.c[0] = 'A'; 成员变量char c[10]拥有10个字节长度,c[0]从低地址开始找到第1个字节即byte0, 赋值u1.c[0]后,内存变为:

  4-3> 赋值u1.c[1] = 'B'; 从低地址开始找到第2个字节即byte1, 赋值u1.c[1]后,内存变为:

  4-4> 赋值u1.c[2] = 'C'; 从低地址开始找到第3个字节即byte2, 赋值u1.c[2]后,内存变为:

  4-5> 赋值u1.c[3] = 'D'; 从低地址开始找到第4个字节即byte3, 赋值u1.c[3]后,内存变为:

  4-6> 读取u1.number, int类型4个字节,从低地址依次读取4个字节byte0 byte1 byte2 byte3,

将这4个字节按照从高地址到低地址排列组合为byte3 byte2 byte1 byte0

即 获取内存中字节时从低地址开始,将获取的字节从高地址到低地址排序,得到的值才是变量的值

原文地址:https://www.cnblogs.com/xieyajie/p/8086861.html