C 共用体的基本概念
共用体(Union)是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。共用体的所有成员共享同一块内存空间,大小由最大的成员决定。共用体的定义方式与结构体类似,但关键字为 union
。
union Data {
int i;
float f;
char str[20];
};
共用体的内存分配
共用体的内存大小等于其最大成员的大小。例如,以下共用体的内存大小为 20 字节(char str[20]
的大小)。
union Data {
int i; // 4 bytes
float f; // 4 bytes
char str[20]; // 20 bytes
};
共用体的基本使用
共用体的成员可以通过成员运算符 .
访问。由于共用体的特性,同一时间只能使用一个成员。
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
data.i = 10;
printf("data.i: %d\n", data.i);
data.f = 220.5;
printf("data.f: %f\n", data.f);
strcpy(data.str, "C Programming");
printf("data.str: %s\n", data.str);
return 0;
}
共用体与结构体的区别
结构体的每个成员占用独立的内存空间,而共用体的所有成员共享同一块内存。以下是一个结构体和共用体的对比示例:
#include <stdio.h>
struct SData {
int i;
float f;
char str[20];
};
union UData {
int i;
float f;
char str[20];
};
int main() {
printf("Size of struct SData: %lu\n", sizeof(struct SData));
printf("Size of union UData: %lu\n", sizeof(union UData));
return 0;
}
输出:
Size of struct SData: 28
Size of union UData: 20
共用体的实际应用
共用体常用于节省内存或实现数据的多态存储。例如,在嵌入式系统中,可以用共用体存储不同类型的数据:
#include <stdio.h>
typedef union {
int raw;
struct {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int value : 14;
} bits;
} SensorData;
int main() {
SensorData data;
data.raw = 0xABCD;
printf("flag1: %u\n", data.bits.flag1);
printf("flag2: %u\n", data.bits.flag2);
printf("value: %u\n", data.bits.value);
return 0;
}
共用体与类型转换
共用体可以用于实现数据的类型转换,例如将浮点数转换为整数的字节表示:
#include <stdio.h>
union FloatToBytes {
float f;
unsigned char bytes[4];
};
int main() {
union FloatToBytes converter;
converter.f = 3.14159;
printf("Float: %f\n", converter.f);
printf("Bytes: %02X %02X %02X %02X\n",
converter.bytes[0],
converter.bytes[1],
converter.bytes[2],
converter.bytes[3]);
return 0;
}
共用体在协议解析中的应用
在通信协议中,共用体可以用于解析不同格式的数据包。例如:
#include <stdio.h>
typedef union {
struct {
unsigned char type;
unsigned short length;
unsigned char data[128];
} packet;
unsigned char raw[132];
} ProtocolPacket;
int main() {
ProtocolPacket pkt;
pkt.packet.type = 0x01;
pkt.packet.length = 128;
printf("Packet size: %lu\n", sizeof(ProtocolPacket));
printf("Raw data size: %lu\n", sizeof(pkt.raw));
return 0;
}
共用体的注意事项
共用体的使用需要注意以下几点:
- 同一时间只能有一个成员有效。
- 对共用体的一个成员赋值会影响其他成员的值。
- 共用体的初始化只能针对第一个成员。
#include <stdio.h>
union Test {
int a;
float b;
};
int main() {
union Test t = {10}; // 只能初始化第一个成员
printf("t.a: %d\n", t.a);
t.b = 3.14;
printf("t.a: %d\n", t.a); // 输出可能不符合预期
return 0;
}
共用体是 C 语言中一种强大的工具,合理使用可以节省内存并实现灵活的数据存储。