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>

最低0.47元/天 解锁文章
779

被折叠的 条评论
为什么被折叠?



