#include <stdio.h>
// 定义联合体,包含不同类型成员
union Data {
int i;
float f;
};
// 定义结构体,包含一个联合体和一个枚举来标识当前存储的数据类型
typedef enum {
TYPE_INT,
TYPE_FLOAT
} DataType;
typedef struct {
DataType type;
union Data data;
} Storage;
// 打印存储的数据
void printData(Storage s) {
switch (s.type) {
case TYPE_INT:
printf("Stored data (int): %d\n", s.data.i);
break;
case TYPE_FLOAT:
printf("Stored data (float): %f\n", s.data.f);
break;
default:
printf("Unknown data type\n");
}
}
int main() {
Storage s1, s2;
// 存储整数
s1.type = TYPE_INT;
s1.data.i = 42;
printData(s1);
// 存储浮点数
s2.type = TYPE_FLOAT;
s2.data.f = 3.14f;
printData(s2);
return 0;
}
结构体和联合体协同工作解释
- 联合体(
union Data
):联合体的所有成员共享相同的内存空间,其大小为最大成员的大小。这意味着在任何时刻,只能有一个成员是有效的,从而节省了内存。例如,这里的int
和float
成员共享相同的内存空间,避免了为每种数据类型单独分配内存。
- 结构体(
Storage
):结构体包含一个枚举类型DataType
来标识当前存储的数据类型,以及一个联合体Data
来实际存储数据。通过这种方式,我们不仅可以复用内存空间(通过联合体),还可以记录当前存储的数据类型,以便在后续使用中正确解析数据。在printData
函数中,通过switch
语句根据type
字段来决定如何打印data
联合体中的数据。这样,结构体和联合体结合使用,既满足了存储不同类型数据的需求,又达到了节省内存空间的目的。