C 语言中结构体 (Structure) 和联合体 (Union) 的区别

结构体 (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;
}
Difference between Structure and Union in C programming Example

如果您观察上面的代码,会发现 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 个字节。

评论已关闭。