在 C 语言中,struct
(结构体)和 union
(联合体)都是用来定义复合数据类型的关键关键字,但它们在存储和管理数据方面有根本的区别。这些区别影响了它们的使用场景和功能。
Struct(结构体)
struct
用于创建一个数据结构,可以包含多个不同类型的数据项(称为成员)。结构体的每个成员都有自己的存储位置,这意味着每个成员都拥有一个独立的内存地址。结构体的大小至少等于所有成员大小的总和(实际大小可能更大,因为编译器可能会添加填充字节来确保适当的内存对齐)。
示例:
struct Person {
char name[50];
int age;
float salary;
};
在这个例子中,结构体 Person
包括三个成员:一个字符数组、一个整数和一个浮点数。结构体的总大小是这三个成员的大小之和,加上可能的任何填充字节。
Union(联合体)
union
允许在相同的内存位置存储不同的数据类型,但一次只能使用其中一个成员。这意味着一个联合体的大小等于其最大成员的大小。使用联合体可以节省内存,因为同一时间只有一个成员被使用,所有成员共享相同的内存地址。
示例:
union Data {
int i;
float f;
char str[20];
};
在这个例子中,联合体 Data
包含一个整数、一个浮点数和一个字符数组。虽然它有三个成员,但任何时候只有一个成员包含有意义的数据。联合体的大小将是三个成员中最大的一个的大小。
主要区别
-
内存使用:
struct
的成员各自占用不同的内存区域。union
的所有成员共享同一块内存区域。
-
大小计算:
struct
的大小是其所有成员大小的总和(加上任何为了内存对齐而添加的填充)。union
的大小是其最大成员的大小。
-
用途:
struct
通常用于数据记录,其中包含多个不同类型的相关数据。union
常用于数据结构中需要存储多种类型但每次只使用一种的情况。
-
设计选择:
- 使用
struct
时,可以同时访问所有成员。 - 使用
union
时,修改一个成员会影响到其它成员(因为内存共享)。
- 使用
使用场景
struct
:适用于需要将多个不同的数据项组合成一个单一的数据结构的场景,例如,定义一个人的属性(名字、年龄和薪水)。union
:适用于节省内存空间且同时只需要使用一个成员的场景,例如,当从不同类型的数据中读取数据但不需要同时存储所有数据时。
这些特性使得 struct
和 union
在 C 程序设计中都扮演着重要的角色,选择哪一个取决于具体的应用需求和内存管理的优化需求。