C 语言结构体与联合体对比:实战指南与选择建议
什么是结构体?
结构体 是 C 语言用户自定义数据类型,将逻辑相关的不同类型数据项组合成单一单元。每个成员占用独立连续内存位置,因此结构体可同时保存多个值。
示例:一个学生记录,在同一变量名下存储姓名、学号、成绩。
什么是联合体?
联合体 也是用户自定义类型,但所有成员共享同一内存空间。联合体大小等于其最大成员大小。这一特性使联合体适合内存受限且同一时刻仅需一个成员的场景。
声明结构体
struct Student {
char name[60];
int roll_no;
float marks;
};
注意 struct 关键字与右大括号后的分号。
结构体使用示例
#include <stdio.h>
struct Student {
char name[60];
int roll_no;
float marks;
} sdt;
int main(void) {
printf("Enter the following information:\n");
printf("Student name: ");
fgets(sdt.name, sizeof(sdt.name), stdin);
printf("Roll number: ");
scanf("%d", &sdt.roll_no);
printf("Marks: ");
scanf("%f", &sdt.marks);
printf("\nEntered data:\n");
printf("Name: %s", sdt.name);
printf("Roll number: %d\n", sdt.roll_no);
printf("Marks: %.1f\n", sdt.marks);
return 0;
}
输出示例:
Enter the following information: Student name: James Roll number: 21 Marks: 67 Entered data: Name: James Roll number: 21 Marks: 67.0
声明联合体
union Item {
int x;
float y;
char ch;
};
联合体使用示例
#include <stdio.h>
union Item {
int x;
float y;
char ch;
};
int main(void) {
union Item it;
it.x = 12;
it.y = 20.2f;
it.ch = 'a';
printf("x = %d\n", it.x);
printf("y = %f\n", it.y);
printf("ch = %c\n", it.ch);
return 0;
}
因所有成员共享内存,设置 ch 会覆盖 x 与 y 的先前值。仅最后存储的值有效。
结构体 vs 联合体
| 特性 | 结构体 | 联合体 |
|---|---|---|
| 声明关键字 | struct | union |
| 内存布局 | 每成员独立空间 | 所有成员共享空间 |
| 修改某成员 | 不影响其他成员 | 覆盖其他成员 |
| 初始化 | 可同时初始化所有成员 | 同一时间只能初始化第一个成员 |
| 总大小 | 所有成员大小之和 | 最大成员大小 |
| 典型用途 | 存储多种类型的相关数据 | 存储多种可能类型中的一种 |
| 访问模式 | 任意成员随时可访问 | 同一时刻仅一个成员有效 |
| 柔性数组支持 | 支持 | 不支持 |
何时使用哪个
- 结构体: 需同时维护多个相关字段,如学生、员工记录
- 联合体: 值可能是几种类型之一但同一时刻只有一种,如变体类型或内存受限的传感器数值
优缺点
结构体优势
- 将相关数据归组在单一名称下,提升可读性
- 易于将整个记录传递给函数
- 结构体数组可存储大量记录
- 支持柔性数组实现变长数据
结构体劣势
- 占用更多内存,因每成员均存储
- 结构体定义变更会波及全代码
- 大型项目中深度嵌套结构体难以驾驭
联合体优势
- 内存占用极小:仅最大成员大小
- 适合实现类型标签或变体数据
- 可简化单一值多类型场景代码
联合体劣势
- 同一时刻仅一个成员持有有效值
- 共享内存导致调试困难
- 不支持柔性数组
C语言
- 钎焊与软焊关键差异全解析
- 二冲程与四冲程发动机核心区别深度解析
- 直流与交流电机核心差异与选型指南
- 石棉与玻璃纤维:关键差异、用途与安全考量
- C++ Struct 与 Class 核心差异、语法及最佳实践
- C# 与 C++ 深度对比:特性、性能与适用场景全景解析
- C 与 C++ 核心差异与选型指南
- C 语言与 Java 全方位对比:特性、历史与应用场景深度解析
- C 语言 strlen 与 sizeof 深度解析:核心差异、陷阱避坑与最佳实践
- Python 与 JavaScript:核心差异、特性及选型指南
- Python 与 Ruby:特性、优势与适用场景全面对比
- Python 2 与 Python 3:关键差异与版本选择指南