C语言共用体和与结构体的区别

共用体与结构体的区别

共用体:
使用union 关键字
共用体内存长度是内部最长的数据类型的长度。
共用体的地址和内部各成员变量的地址都是同一个地址

结构体大小:
结构体内部的成员,大小等于最后一个成员的偏移量+最后一个成员大小+末尾的填充字节数。
结构体的偏移量:某一个成员的实际地址和结构体首地址之间的距离。
结构体字节对齐:每个成员相对于结构体首地址的偏移量都得是当前成员所占内存大小的整数倍,如果不是会在成员前面加填充字节。结构体的大小是内部最宽的成员的整数倍。

共用体

#include <stdio.h>
//gcc让不同类型的变量共享内存地址 ,同一时间只有一个成员有效
union data{ 
    int a;
    char b;
    int c;
};


int main(){
    union data data_1 = {1};//初始化时只填写一个值。(同一时间只有一个成员有效)
    data_1.b = 'c';
    data_1.a = 10;//后赋值的才有效。前面的赋值被覆盖
    //打印地址,发现指向同一个地址
    printf("%p\n%p\n%p\n",&data_1.a,&data_1.a,&data_1.a);
    return 0;
}
### C语言共用体结构体区别 #### 定义内存分配 结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起形成一个新的复合型数据项[^1]。当定义一个结构体时,编译器会为每个成员分别分配独立的内存空间,总大小等于各成员所需空间之。 相反,共用体(`union`)也是一种聚合数据类型,但是其内部的所有成员共享同一块内存区域。这意味着,在任意时刻,共用体内仅能保存其中一个成员的有效值,而其他成员的内容可能会被覆盖或变得不可预测[^4]。 ```c // 结构体示例 struct ExampleStruct { int integer; double floatingPoint; }; // 共用体示例 union ExampleUnion { int integer; double floatingPoint; }; ``` #### 数据存取方式 对于结构体而言,可以通过`.`运算符逐个访问其中的每一个字段,并且这些字段可以在程序的不同部分同时持有有效值[^3]。然而,由于共用体内的所有成员共享相同的物理位置,因此一次只能有一个成员处于活动状态;一旦给另一个成员赋新值,则先前存储的信息将会丢失。 #### 存储效率对比 因为结构体会为其所有的成员都保留足够的连续字节来容纳它们各自的最大可能长度,所以通常情况下占用更多的内存资源。相比之下,共用体只占用了它所含最大尺寸成员所需的那部分空间,从而提高了某些特定应用场景下的存储利用率。 #### 使用场景差异 - **结构体**适用于需要封装多种不同属性的对象建模场合,比如表示一个人的基本信息(姓名、年龄等),或是记录文件系统的节点元数据。 - **共用体**则更多地应用于那些只需要在相同的位置上交替存放几种互斥性质的数据的情形下,例如实现一个多态性的配置选项容器,或者是处理硬件寄存器映射等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值