1. 共用体union的本质与内存布局
共用体(union)是C语言中一种特殊的数据类型,它与结构体(struct)最大的区别在于内存使用方式。struct的每个成员拥有独立的内存空间,而union的所有成员共享同一块内存区域。这种设计理念源于计算机底层对内存资源的极致利用需求。
1.1 内存共享机制详解
当定义一个union时,编译器会分配足够容纳最大成员的内存空间。假设我们有以下union定义:
c复制union Data {
int i;
float f;
char str[20];
};
在32位系统中,这个union的内存布局将是:
- 总大小:20字节(由char str[20]决定)
- 三个成员i、f、str都从同一内存地址开始
- 任何时刻只有最后被赋值的成员是有效的
重要提示:修改union的一个成员会直接影响其他成员的值,因为它们共享同一内存空间。这是与struct最本质的区别。
1.2 大小端序对union的影响
由于union共享内存的特性,它在处理字节序问题时表现出独特优势。考虑以下示例:
c复制union EndianTest {
int num;
char bytes[4];
};
union EndianTest test;
test.num = 0x12345678;
// 在小端系统中:
// test.bytes[0] = 0x78
// test.bytes[1] = 0x56
// test.bytes[2] = 0x34
// test.bytes[3] = 0x12
这种特性使得union成为检测系统字节序的理想工具,也是网络协议处理中常用的技术手段。
2. union的定义与使用规范
2.1 定义与初始化方法
union的定义语法与struct类似,但行为完全不同。以下是标准定义方式:
c复制union MyUnion {
int integer;
double real;
char character;
};
初始化union时需要注意:
- 只能初始化第一个成员
- 其他成员需要通过后续赋值操作设置
- 可以使用复合字面量进行初始化(C
