【C语言】第六课 联合体(Union)和位域(Bit-field)

C语言中的联合体(Union)和位域(Bit-field)是处理内存布局和实现数据高效存储的强力工具,尤其在底层编程、协议解析和逆向工程中非常重要。

🧠 1. 联合体(Union)

联合体是一种特殊的自定义数据类型,它允许在同一块内存空间中存储不同类型的数据成员,但在任意时刻只能使用其中一个成员。

1.1 定义与基本使用

使用 union 关键字定义联合体,其语法与结构体类似:

union Data {
   
   
    int i;        // 整型成员
    float f;      // 浮点成员
    char str[20]; // 字符数组成员
};
  • 内存共享:所有成员共享同一段内存,联合体的大小由其最大成员决定(例如上例中约为20字节,取决于 char str[20] 和系统对齐规则)。
  • 访问成员:使用点操作符 . 访问联合体变量的成员,若通过指针访问则使用箭头操作符 ->
    union Data data;
    data.i = 10;       // 此时联合体存储的是整数
    printf("%d\n", data.i);
    
    data.f = 220.5;    // 写入浮点数,覆盖之前的整数值
    printf("%f\n", data.f);
    
  • 初始化:联合体初始化时只能初始化其第一个成员
    union Data data = {
         
         10}; // 正确:初始化第一个成员i
    // union Data data = {.f = 220.5}; // C99后允许指定初始化成员,但仍需注意覆盖
    
1.2 内存布局与逆向重点

联合体的所有成员都从相同的内存地址开始存储。这意味着改变一个成员的值会直接影响其他成员的值,因为它们操作的是同一片内存区域的不同解释方式。

#include <stdio.h>
#include <stdint.h>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值