联合体 union
union 共享内存、大小端判断、union 与 struct 的区别
联合体 union
union 的所有成员共享同一块内存——同一时刻只有一个成员有效。适合节省内存,或者用来查看数据的另一种表示。
学完本章你将: 理解共享内存、用 union 判断大小端、union vs struct。
union 基础
c
#include <stdio.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data d;
d.i = 42;
printf("d.i = %d\n", d.i); // 42
d.f = 3.14; // 覆盖了 d.i!
printf("d.f = %f\n", d.f); // 3.140000
printf("d.i = %d\n", d.i); // 垃圾值——已被覆盖
return 0;
}
💡 union 的大小 = 最大成员的大小。所有成员从同一地址开始。
判断 CPU 大小端
c
#include <stdio.h>
int main() {
union {
int i;
char c[4];
} endian = { .i = 1 };
if (endian.c[0] == 1) {
printf("小端(Little Endian)\n"); // x86 架构
} else {
printf("大端(Big Endian)\n");
}
return 0;
}
union + struct 组合(常用模式)
c
typedef struct {
int type; // 0=整数, 1=浮点数
union {
int iVal;
float fVal;
} value;
} Variant;
void print(Variant v) {
if (v.type == 0) printf("int: %d\n", v.value.iVal);
else printf("float: %f\n", v.value.fVal);
}