当前位置:首页 > 内存 > 正文

共用体内存分配

  • 内存
  • 2024-06-06 07:31:20
  • 7524

一、一个关于共用体的题目在32位机器中,int和long类型都占用4个字节的存储空间,所以在union类型变量mix的情况下,如果按照最大空间分配,则占用4个字节的空间,所以在mix.i=0x12345678,0x12345678使用了4个字节的空间,这意味着这4个字节存储并解释为long类型,如果这4个字节的数据解释为int,则为0x12345678,因此int为以十六进制格式输出数据。,输出也是0x12345678。


二、C语言:很奇怪的union

union定义的union类型与struct的定义方法相同,但内存分配不同。

联合体中的每个组件都是从“相同的内存地址”分配的,因此您定义的联合体u中的组件i和数组a具有相同的起始地址,即说i和a共享内存,但i只占用2个字节(16位编译器),a占用4个字节(16位编译器),因为每个整数占用2个字节。换句话说,i和a[0]使用相同的内存空间。因此结果为1。

3、演示图如下​​:

----------------+

a=[1]||

+--------10------+

•联合非常强大,C++变体类型是使用联合实现的。


三、共用体变量内存分配C语言事实上,联合的每个成员都从相同的地址开始存储。一次只能存储一个成员,这就要求它在分配内存单元时满足两点:
1联合类型占用的空间是其最长成员占用的存储空间;
2如果最长存储空间是其他成员的元类型(如果是数组,则获取其类型的数据长度,例如inta[5]为4)不满足整除关系,则自动扩展最大空间;
我们看一下这段代码:
unionsample
{
shortintn;//长度2
charc[10];//长度10
floatf;//长度4
}s;
原始样本空间应该是sizeof(char)*10=10但是如果只有10个单位,那么float类型有多少个(4位)可以存储两个半,所以空间的范围必须大于?10、并且要满足其他成员所需空间的满倍数,即12
所以联合体的存储空间首先取决于它的哪个成员占用的空间最大,然后比较其他成员的元素长度如果能被整除,则可以,否则,找到第一个能被整除的数