结构体 (Structure) 和联合体 (Union) 都用于将不同的数据类型分组,以便结构化地组织数据。在 C 语言编程中,结构体和联合体在语法上很相似,仅关键字不同。这意味着创建这些变量以访问它们各自的成员的方式是相同的,只有关键字不同。在之前的文章中,我们已经通过多个示例解释了这些概念,请参考那些文章。
本文通过一个示例向您展示 C 语言编程中结构体和联合体的区别。在进入实际示例之前,我们先来看看它们的区别。
| 结构体 (Structures) | 联合体 |
|---|---|
| 使用 Struct 关键字来声明结构体。 | 使用 Union 关键字来声明联合体。 |
| 结构体变量会为所有结构体成员分别分配内存。 | 联合体变量会为所有联合体成员分配共用的内存。 |
| 示例 struct Employee{ int age; char name[50]; float salary; }; | 示例 union Employee{ int age; char name[50]; float salary; }; |
| 结构体将占用更多的内存空间。 内存大小 = 所有结构体成员大小之和。 内存大小 = int + char 数组 [50] + float 内存大小 = 2 + 50 + 4 字节 内存大小 = 56 字节 | 与结构体相比,联合体占用的内存空间更少。内存大小 = 最大联合体成员的大小。根据上面的例子,最大的成员是 char 数组。所以,内存大小 = 50 字节。 |
| 它允许我们随时访问任何一个或所有成员。 | 它一次只允许我们访问一个联合体成员。 |
用 C 程序找出结构体和联合体之间的区别
在这个程序中,我们将声明具有相同数据类型成员的结构体和联合体。然后我们将使用 sizeof 函数计算它们的大小。在了解这些差异之前,我建议您参考本编程语言教程中的结构体和联合体文章。
#include <stdio.h>
struct Employee
{
int age;
char Name[50];
char Department[20];
float Salary;
};
union Person
{
int ag;
char Nam[50];
char Departent[20];
float Salar;
};
int main()
{
struct Employee emp1;
union Person Person1;
printf(" The Size of Employee Structure = %d\n", sizeof (emp1) );
printf(" The Size of Person Union = %d\n", sizeof (Person1));
return 0;
}

如果您观察上面的代码,会发现 Employee 和 Person 都拥有相同的数据类型和大小。在 main() 函数中,我们使用下面的语句创建了 Employee 结构体变量 emp1。
struct Employee emp1;
接下来,我们使用下面的语句创建了 Person 联合体变量 Person1。
union Person Person1;
然后,在 printf 语句中,我们使用 C 的 sizeof 运算符来计算 Employee 结构体和 Person 联合体的大小。
sizeof (emp1) = 80
int Age; - It will take 4 bytes of space in the memory char Name[50]; - It will take 50 bytes of space in the memory char Department[20]; - It will take 20 bytes of space in the memory float Salary; - It will take 4 bytes of space in the memory
结构体的内存大小 = 4 + 50 + 20 + 4 => 78 字节。
如果您观察输出,它显示的是 80 字节。这是因为结构体填充(structure padding)导致它多占用了 2 个字节。我们将在后续的文章中讨论结构体填充。
sizeof (Person1) = 52 字节
上面最大的成员是 Name[50]。众所周知
内存大小 = 最大联合体成员的大小 = 50 字节。
这里同样因为填充而多了 2 个字节。
评论已关闭。