C语言联合体(union)实战:如何用1个变量存3种数据?附内存布局图解
在嵌入式开发中,内存资源往往非常宝贵。当我们需要处理多种数据类型但又不确定具体会使用哪一种时,联合体(union)就成为了一个极具价值的工具。本文将带你深入探索联合体的工作原理,并通过实际案例展示如何高效利用这一特性。
1. 联合体的本质与内存布局
联合体是C语言中一种特殊的数据结构,它允许在同一内存位置存储不同的数据类型。与结构体(struct)不同,联合体的所有成员共享同一块内存空间,这意味着任何时候只能有一个成员包含有效值。
union Data {
int i;
float f;
char str[20];
};
内存共享机制是这个特性的核心。假设我们有一个32位系统,上面定义的Data联合体将占用20字节(足够容纳最大的成员str)。当我们给i赋值时,它会覆盖f和str的部分内容;同样,给f赋值会影响i和str。
注意:联合体的大小总是等于其最大成员的大小,并会根据需要进行内存对齐。
下面是一个典型的内存布局示意图:
+---------------------+
| int i | (4字节)
+---------------------+
| float f | (4字节)
+---------------------+
| char str[20] | (20字节)
+---------------------+
实际上,这三个成员共享同一块内存区域的起始地址。
2. 硬件寄存器操作实战案例
在嵌入式系统中,硬件寄存器经常需要以不同方式访问。联合体在这里大显身手:
typedef union {
struct {


919

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



