在 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 包含一个整数、一个浮点数和一个字符数组。虽然它有三个成员,但任何时候只有一个成员包含有意义的数据。联合体的大小将是三个成员中最大的一个的大小。

主要区别

  1. 内存使用

    • struct 的成员各自占用不同的内存区域。
    • union 的所有成员共享同一块内存区域。
  2. 大小计算

    • struct 的大小是其所有成员大小的总和(加上任何为了内存对齐而添加的填充)。
    • union 的大小是其最大成员的大小。
  3. 用途

    • struct 通常用于数据记录,其中包含多个不同类型的相关数据。
    • union 常用于数据结构中需要存储多种类型但每次只使用一种的情况。
  4. 设计选择

    • 使用 struct 时,可以同时访问所有成员。
    • 使用 union 时,修改一个成员会影响到其它成员(因为内存共享)。

使用场景

  • struct:适用于需要将多个不同的数据项组合成一个单一的数据结构的场景,例如,定义一个人的属性(名字、年龄和薪水)。
  • union:适用于节省内存空间且同时只需要使用一个成员的场景,例如,当从不同类型的数据中读取数据但不需要同时存储所有数据时。

这些特性使得 structunion 在 C 程序设计中都扮演着重要的角色,选择哪一个取决于具体的应用需求和内存管理的优化需求。

05-07 12:33