自定义类型联合体(上)

简介: 自定义类型联合体

联合体

联合体类型的声明

像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。

但是编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用同一块内存空间。

所以联合体也叫:共用体

给联合体其中一个成员赋值,其他成员的值也跟着变化

联合体的特点

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

我们来看一个代码

#include <stdio.h>
//联合类型的声明
union Un
{
  char c;
  int i;
};
int main()
{
  //联合变量的定义
  union Un un = { 0 };
  //计算连个变量的⼤⼩
  printf("%d\n", sizeof(un));
  return 0;
}

我们知道char类型是占一个字节,int类型是占4个字节的,按理说联合体的大小应该至少是大于或等于5个字节才对,但是运行结果却恰恰相反

我们再回头看上面的一句话

编译器只为最大的联合体成员分配足够的内存空间,那么这里的最大的成员就应该是int类型

所以联合体的内存大小就是int类型的大小,而char类型就是和int类型共用那4个字节的内存

为了更深入的了解联合体和联合体成员的内存是怎样分配的,我们来看下一段代码

#include <stdio.h>
//联合类型的声明
union Un
{
  char c;
  int i;
};
int main()
{
  //联合变量的定义
  union Un un = { 0 };
  //计算连个变量的⼤⼩
  printf("%p\n", &un);
  printf("%p\n", &(un.c));
  printf("%p\n", &(un.i));
  return 0;
}

我们发现结果是一模一样的,我们可以推测当int i的第一个字节是属于char c的,所以我们取地址c就是取地址i的第一个字节

而联合体又叫共用体,说明我们只要改变其中任意一个成员,那其他成员也是会受到影响的

联合体也是可以匿名的

union 
{
  char c;
  int i;
}u;

相同成员的结构体和联合体对比

我们再对比一下相同成员的结构体和联合体的内存布局情况

//结构体
struct S
{
  char c;
  int i;
};
struct S s = { 0 };
//联合体
union Un
{
  char c;
  int i;
};
union Un un = { 0 };

联合体大小的计算

联合的大小至少是最大成员的大小

当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍

下面会涉及到内存对齐

可以先看一下我之前写的一篇文章自定义类型结构体(中)

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


相关文章
|
Java 测试技术 API
Java新纪元:模块化设计重塑开发体验,让代码如艺术品般优雅!
【8月更文挑战第30天】Java模块化设计是一种通过将应用程序分解为独立、可重用模块来提高代码可维护性和可扩展性的方法。其核心是自Java 9引入的Java Platform Module System(JPMS)。模块化设计增强了封装性,简化了依赖管理和系统维护,并通过按需加载模块提升了性能。每个模块有明确职责和接口,通过`module-info.java`文件定义。实战示例展示了如何创建和使用模块。最佳实践包括明确模块职责、减少依赖、使用模块描述符及模块化测试,从而构建健壮、可维护的应用程序。
161 2
|
10月前
|
传感器 人工智能 数据可视化
数字孪生与环境监测:生态保护的新手段
【10月更文挑战第31天】数字孪生技术通过传感器、物联网、虚拟现实和人工智能等手段,创建物理环境的数字副本,实现实时监测、预测和优化。在环境监测中,数字孪生可应用于空气质量、水质监测和自然保护区管理等领域,提高决策效率和准确性,助力生态保护和可持续发展。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
本文旨在通过深入浅出的方式,为读者揭示卷积神经网络(CNN)的神秘面纱,并展示其在图像识别领域的实际应用。我们将从CNN的基本概念出发,逐步深入到网络结构、工作原理以及训练过程,最后通过一个实际的代码示例,带领读者体验CNN的强大功能。无论你是深度学习的初学者,还是希望进一步了解CNN的专业人士,这篇文章都将为你提供有价值的信息和启发。
|
运维 jenkins Linux
【Jenkins稳定运维】服务器频繁崩溃?资深管理员的应对策略
本文分享了作者作为管理员在面对服务器频繁崩溃时的应对策略,包括使用Shell脚本优化运维工作、学习Jenkins Pipeline插件以及一些运维技能扩展,强调了在运维工作中不断学习和实践的重要性。
144 0
【Jenkins稳定运维】服务器频繁崩溃?资深管理员的应对策略
|
消息中间件 算法 Java
面试官:Kafka中的key有什么用?
面试官:Kafka中的key有什么用?
499 3
面试官:Kafka中的key有什么用?
|
存储 缓存 边缘计算
网站静态资源访问加速
本方案使用阿里云CDN产品来分发OSS上的网站静态文件,不仅可以降低源站的负载压力,还能够提升网站的访问性能,同时还能在高并发场景下为您节约成本。
222 4
|
6月前
|
Java
课时74:多态性简介
多态性是面向对象中的第三大主要特征,多态性是在继承性的基础之上扩展出来的概念,也就是说可以实现父子类之间的相转化处理。 1.方法的多态性 2. 对象的多态性
|
SQL 存储 BI
数据仓库名词和术语
数据仓库名词和术语
|
机器学习/深度学习 语音技术
Hotword模型在语音识别系统中定义为能够识别特定关键词或短语(也称为唤醒词)的模型
Hotword模型在语音识别系统中定义为能够识别特定关键词或短语(也称为唤醒词)的模型
766 9
|
编译器 C++
预处理器指令:编程利器
预处理器指令:编程利器