1、基本定义与语法
1)struct 结构体
每个成员都有 独立的内存空间,多个成员可以同时存在且独立访问。
#include <stdio.h>
// 定义结构体
struct Example {
int i;
float f;
};
int main() {
// 创建结构体变量并初始化
struct Example e1;
e1.i = 42;
e1.f = 3.14f;
// 输出结构体成员
printf("e1.i = %d\n", e1.i);
printf("e1.f = %.2f\n", e1.f);
// 使用结构体数组
struct Example arr[2] = {
{1, 1.1f},
{2, 2.2f}
};
for (int j = 0; j < 2; j++) {
printf("arr[%d] = { i: %d, f: %.1f }\n", j, arr[j].i, arr[j].f);
}
return 0;
}
2)union 联合体
所有成员共享同一块内存空间,任何时刻只能存储一个成员的值,写入一个成员可能会破坏其他成员的值。
#include <stdio.h>
union Example {
int i;
float f;
};
int main() {
union Example ex;
// 存储 int 值
ex.i = 42;
printf("ex.i = %d\n", ex.i);
// 存储 float 值,将覆盖之前的 int 值
ex.f = 3.14f;
printf("ex.f = %.2f\n", ex.f);
// 再次访问 int,注意值已经被 float 覆盖
printf("Now ex.i (after storing float) = %d\n", ex.i);
return 0;
}
2、内存布局区别
结构体(struct
)和联合体(union
)都是用户自定义的复合数据类型,但它们在内存布局和使用方式上有显著差别。
特性 | struct (结构体) | union (联合体) |
内存分配 | 每个成员都有自己的内存空间 | 所有成员共享同一段内存空间 |
大小 | 大小是所有成员大小之和(含对齐填充) | 大小是最大成员的大小(含对齐填充) |
用途 | 同时保存多个字段的数据 | 多个字段 共用一段内存 ,节省空间 |
访问 | 可同时访问多个成员 | 任何时刻只能有效访问一个成员 |
例如,
#include <stdio.h>
struct MyStruct {
int i;
float f;
char c;
};
union MyUnion {
int i;
float f;
char c;
};
int main() {
printf("struct 大小: %lu\n", sizeof(struct MyStruct));
printf("union 大小: %lu\n", sizeof(union MyUnion));
return 0;
}
3、用途对比
如需要同时使用多个字段,用 struct
。如需要在不同时间使用不同字段,并且想节省空间,用 union
。
用途/特点 | struct (结构体) | union (联合体) |
多个字段同时有效 | ✅ 是 | ❌ 否(任一时刻只有一个字段有效) |
节省内存 | ❌ 否(分配每个字段内存) | ✅ 是(多个字段共享内存) |
使用场景 | 存储多种属性的数据结构(如学生信息) | 用于节省内存,如解析协议字段/变体结构体等 |
成员访问行为 | 成员间独立,不影响彼此 | 修改一个成员可能会影响其他成员 |