【C语言】联合体-共用体 (union) 详解

简介: 【C语言】联合体-共用体 (union) 详解

什么是联合体



联合(union)是一种数据类型,它能在同一个内存空间中存储不同的数据类型(不是同时存储)其典型的用法是,设计一种表以存储既无规律、事先也不知道顺序的混合类型。使用联合类型的数组,其中的联合都大小相等,每个联合可以存储各种数据类型。。联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。


联合类型的定义



联合也是一种特殊的自定义类型

这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以联合也叫共用体)。


//联合类型的声明
union Un
{
 char c;
 int i;
};
//联合变量的定义
union Un un;


联合体的特点



联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。


union Un
{
  int i;
  char c;
};
union Un un;
int main()
{
  printf("%d\n", &(un.i));
  printf("%d\n", &(un.c));
  system("pause");
  return 0;
}



由此可见,i 和 c都在共用一块空间。


所以对于联合体来说同一时间只能使用一个,如果两个一起使用的话,他们共用同一块空间,改变一个,另外一个也会跟着改变,内存会被覆盖掉了.


  • 面试题:
  • 判断当前计算机的大小端存储


un联合体 占四个字节(下面会讲到如何计算),如果是 把i 赋成1 按照小端存放就是 01 00 00 00,在判断 u.c 是否等于1(char类型只读取一个字节数据,) 如果等于1 就是小端,反之就是大端存储


#include<stdio.h>
union Un
{
  int i;
  char c;
};
union Un un;
int main()
{
  un.i = 1;
  if (un.c == 1)
  {
    printf("小端存储\n");
  }
  else
  {
    printf("大端存储\n");
  }
  return 0;
}


那联合体大小该如何计算呢?


联合大小的计算



  1. 联合的大小至少是最大成员的大小。
  2. 当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
  3. 联合也是需要内存对齐的


  • 请看下面的例子:


#include<stdio.h>
#include<stdlib.h>
union Un1
{
 char c[5];
 int i;
};
union Un2
{
 short c[7];
 int i;
};
//下面输出的结果是什么?
int main
{
  printf("%d\n", sizeof(union Un1));
  printf("%d\n", sizeof(union Un2));
  return 0;
}


  • printf(“%d\n”, sizeof(union Un1));



答案是-> 8

因为要对齐最大对齐数整数倍,中间浪费了几个空间


  • printf(“%d\n”, sizeof(union Un2));



答案是-> 16

目录
相关文章
|
1月前
|
存储 数据可视化 编译器
【C语言】union 关键字详解
联合体(`union`)是一种强大的数据结构,在C语言中具有广泛的应用。通过共享内存位置,联合体可以在不同时间存储不同类型的数据,从而节省内存。在嵌入式系统、硬件编程和协议解析等领域,联合体的使用尤为常见。理解和正确使用联合体可以使代码更加高效和灵活,特别是在内存受限的系统中。
82 3
【C语言】union 关键字详解
|
3月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
8月前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
49 0
|
3月前
|
存储 编译器 Linux
深入理解 C 语言中的联合体
深入理解 C 语言中的联合体
|
5月前
|
存储 编译器 C语言
【C语言篇】自定义类型:联合体和枚举详细介绍
像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
52 1
|
7月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
123 2
|
7月前
|
存储 编译器 C语言
C语言的联合体:一种节省内存的数据结构
C语言的联合体:一种节省内存的数据结构
|
8月前
|
存储 安全 程序员
C语言中的共用体(Union)技术详解
C语言中的共用体(Union)技术详解
737 0
|
8月前
|
存储 安全 编译器
C语言中的共用体(Union)技术详解
C语言中的共用体(Union)技术详解
171 0
|
8月前
|
存储 编译器 C语言
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
30 0