【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语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
26 0
|
21天前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
19 2
|
15小时前
|
存储 编译器 C语言
C语言的联合体:一种节省内存的数据结构
C语言的联合体:一种节省内存的数据结构
6 0
|
1月前
|
存储 编译器 程序员
C语言:自定义类型 - 结构体 & 联合体 & 枚举
C语言:自定义类型 - 结构体 & 联合体 & 枚举
25 2
|
29天前
|
存储 安全 程序员
C语言中的共用体(Union)技术详解
C语言中的共用体(Union)技术详解
57 0
|
1月前
|
存储 编译器 C语言
[C语言]自定义类型(结构体~枚举~联合体)
[C语言]自定义类型(结构体~枚举~联合体)
|
1月前
|
存储 安全 编译器
C语言中的共用体(Union)技术详解
C语言中的共用体(Union)技术详解
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
【C语言】自定义类型 -- -- 结构体、位段、枚举、联合体
11 0
|
1月前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(中)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
25 0
|
1月前
|
编译器 C语言 C++
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(上)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
12 0