C语言中的联合体union所占内存方式
2024-10-20 11:59:38
当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:
1)联合体是一个结构;
2)它的所有成员相对于基地址的偏移量都为0;
3)此结构空间要大到足够容纳最"宽"的成员;
4)其对齐方式要适合其中所有的成员;
下面解释这四条描述:
由于联合体中的所有成员是共享一段内存的,因此每个成员的存放首地址相对于于联合体变量的基地址的偏移量为0,即所有成员的首地址都是一样的。
为了使得所有成员能够共享一段内存,因此该空间必须足够容纳这些成员中最宽的成员。对于这句“对齐方式要适合其中所有的成员”是指其必须符合所有成员的自身对齐方式。
示例:
union U
{
char s[];
int n;
double d;
};
上面的程序中的,
s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。
然而其实际大小并不是9,用运算符sizeof测试其大小为16.
这是因为这里存在字节对齐的问题,9既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。
从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:
1)大小足够容纳最宽的成员;
2)大小能被其包含的所有基本数据类型的大小所整除。
最新文章
- 深入理解javascript原型和闭包(3)——prototype原型
- oracle分组取第一条
- vbox 不识别u盘的问题
- db2数据库新手可能碰到的问题及详解(部分内容来自网络搜索)
- Couchbase
- 一道面试题比较synchronized和读写锁
- wordpress plugins collection
- c#怎么获取当前页面的url
- MYSQL 基础操作
- 收集的css布局
- elya:给移动APP创业者的工具集(一)
- Exiting the Matrix: Introducing Metasploit's Hardware Bridge
- 【JAVA零基础入门系列】Day5 Java中的运算符
- 手机APP应用外网访问本地WEB应用
- Maven install报MojoFailureException
- Metricbeat 的使用
- THE CUSTOMISER
- JAVA Double去掉科学计数";E";
- C/C++下scanf的%匹配以及过滤字符串问题
- PyDev:warning: Debugger speedups using cython not foun