1. 联合体与枚举类型概述
在C语言开发中,结构体、联合体和枚举是三种最常用的自定义数据类型。相比结构体,联合体(union)和枚举(enum)的使用场景更为特殊但同样重要。联合体通过共享内存空间实现数据的"或"关系存储,而枚举则为整型常量提供了更具可读性的命名方式。
我在嵌入式开发中曾遇到一个典型案例:需要处理来自不同传感器的数据包,这些数据包共用同一块内存区域但格式各异。使用联合体可以优雅地解决这个问题,避免了繁琐的类型转换和内存拷贝。而枚举类型则在状态机实现、错误码定义等场景大幅提升了代码的可维护性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 联合体深度解析
2.1 联合体的内存布局特性
联合体的定义语法与结构体相似,但所有成员共享同一块内存空间。这意味着:
c复制union SensorData {
int raw_value;
float temp;
char id[4];
};
这个联合体的大小由其最大成员决定(本例中为4字节的float)。在ARM Cortex-M3平台上实测内存占用如下:
| 成员类型 | 占用字节 | 对齐要求 |
|---|---|---|
| int | 4 | 4 |
| float | 4 | 4 |
| char[4] | 4 | 1 |
关键提示:在通信协议解析中,联合体常被用来处理"类型变体"数据。比如Modbus协议中,同一个寄存器地址可能存储整数或浮点数。
2.2 联合体的高级应用技巧
2.2.1 位域操作
通过联合体与位域结合,可以方便地访问数据的特定位:
c复制union StatusReg {
uint32_t value;
struct {
uint32_t ready:1;
uint32_t error:1;
uint32_t reserved:30;
} bits;
};
2.2.2 数据转换技巧
在嵌入式开发中,我们经常需要将float转为字节数组传输:
c复制union FloatConvert
