㈠ c语言 struct与uniont实际占用的内存大小怎么计算
咋windows下double占8个字节,如果考虑对齐那就是ctm和open共用八个字节,high和low共用八个字节,close自己用八个字节,vol自己用八个字节,所以是32
linux下是double4个字节吧。
㈡ C语言的结构体和共同体的区别是什么
结构体(structure)是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型,而且每个成员的数据类型可以相同也可以不相同。共同体(union)将几种不同的变量储存在同一内存单元中,也就是使用覆盖技术,几个变量互相覆盖,这种几个不同的变量共同占用一段内存的结构,可见二者最大的区别就是所占用的内存,结构体(structure)所占用的内存是分量内存之和,共同体(union)所占用的内存是等于最大的分量的内存。
具体来说,结构体(structure)与共同体(union)主要有以下区别:
1.结构体(structure)与共同体(union)都是由多个不同的数据类型成员组成,
但在任何同一时刻,
共同体(union)中只存放了一个被选中的成员,
而结构体(structure)的所有成员都存在。在结构体(structure)中,各成员都占有自己的内存空间,它们是同时存在的。一个结构体(structure)变量的总长度等于所有成员长度之和。在共同体(union)中,所有成员不能同时占用它的内存空间,它们不能同时存在。共同体(union)变量的长度等于最长的成员的长度。
2.
对于共同体(union)的不同成员赋值,
将会对其它成员重写,
原来成员的值就不存在了,
而对于结构体(structure)的不同成员赋值是互不影响的。
㈢ C语言union的用法
1、我们利用C语言定义一个简单的Union共用体结构。
㈣ C语言union 和struct,什么时候用union比struct更好,解释就可以了
对于一个union类型的变量,所有成员变量共享一块内存,该内存的大小有这些成员变量中长度最大的一个来决定 union分配的内存是连续的。
那为什么要发明union呢?这是由于union的特性决定的,因为struct中成员变量虽然内存都是独立的,但是struct不能保证分配的内存是连续的。
举个例子:CPU的ax寄存器分为ah和al两部分,我们现在要给其赋值,就可以采用union:
union _ax_register {
int i; // 4Bytes, union将按此分配一个4字节的连续内存
unsigned short ah; // 2 Bytes
unsigned short al; // 2 Bytes
} ax_register;
现在,给ax_register.i赋值,其高16bit就会赋给ah,低16bit就会赋给al,是不是很方便呢?
再举个例子,IP地址,我们使用union,就可以直接给他赋一个int值,就能给IP的四个段同时赋值,如果用struct,就麻烦多喽,如下:
union _ip_address {
int i; // spaceholder
unsigned char ip_first_num;
unsigned char ip_second_num;
unsigned char ip_third_num;
unsigned char ip_fourth_num;
} ip_address;
这样,给ip_address.i 赋值,就自动将其8bit 8bit的赋给了四个IP字段。是不是很方便?更方便的是,现在要比较两个IP地址的大小,只要比较这个int值就OK了
㈤ C语言中struct结构体和union共用体在物理内存上有何异同
struct
会为每一个属性分配一块合理的内存(之所以说合理是因为存在内存对齐),而union会分配一块最大的成员占有的内存,比如含有double和char
他就会给一块double大小的内存,当写入一个变量时原来的变量的值将会被冲刷掉,也就是实现了内存共用。
㈥ c语言 union 中包含 struct
两个类型不一样
strut 的成员 彼此独立的内存空间
union的成员则是共享 内存空间