【C语言】联合(共用体)
目录
一、什么是联合体
二、联合类型的声明
三、联合变量的创建
四、联合的特点
五、联合体大小的计算
六、联合的应用(判断大小端)
七、联合体的优缺点
7.1 优点
7.2 缺点
一、什么是联合体
联合也是一种特殊的自定义类型。由多个不同类型的数据成员组成的复合数据类型。
这种类型定义的变量也包含一系列的成员,特征是这些成员共用同一块空间,所以联合也叫:共用体。
二、联合类型的声明
定义一个联合类型的形式如下:
union 联合名
{
成员列表
};
成员列表中含有若干成员,成员的一般形式为: 类型说明符 成员名
成员名的命名应符合标识符的规定。
三、联合变量的创建
#include <stdio.h>//联合类型的声明
union Un
{char c;int i;
}un2; //声明的同时并创建un2union Un un3;//先声明再创建un3 (全局变量)int main()
{//联合变量的定义union Un un1 = { 0 };//先声明再创建un1并初始化 (局部变量)return 0;
}
四、联合的特点
我们运行下面一段代码:
#include <stdio.h>union Un
{char c;int i;
};
int main()
{union Un un = { 0 };printf("%d\n", sizeof(un));//计算联合体的大小return 0;
}
运行结果如下:

为什么运行结果为4呢?
那我们就要引入联合体的特点了。
联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联合至少得有能力保存最大的那个成员)。
由于联合体的所有成员共用同一空间,改变其中一个成员的值可能会影响到其他成员的值,因此联合体中的成员不能同时存在,只适合在某一时间只使用其中单个成员时使用。
就像共享自行车,共享状态,但只能一个人骑,你骑我不骑,我骑你不骑。
例如:
#include <stdio.h>union Un
{char c;int i;
};int main()
{union Un un = { 0 };un.i = 0x11223344;un.c = 0x00;printf("%x\n", un.i);return 0;
}
调试结果如下:


我们发现运行到c的时候a跟着改变了,将a的第4个字节的内容修改为00了。
先改变的是低地址处的数据(这里是小端存放)。
由此可以发现:联合体的成员是共用一块内存空间的。
五、联合体大小的计算
- 联合的大小至少是最大成员的大小。
- 联合体在计算大小的时候也存在内存对齐。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
例:
#include <stdio.h>union Un1
{char c[5]; //1 8 1//看类型,相当于5个char放在这里,所以自身对齐数为1,默认对齐数为8int i; //4 8 4};int main()
{printf("%d\n", sizeof(union Un1));//输出8return 0;
}
分析:
1、创建一个char类型数组,大小为5个字节,这里相当于5个char,自身对齐数为1,默认对齐数为8,所以对齐数为1。
2、int类型的i自身大小为4个字节,默认对齐数为8,自身对齐数为4,所以对齐数为4。
i和c中最大的对齐数为4,而最大成员大小是数组c(5个字节),5不是4的倍数,对齐规则要求:对齐到最大对齐数(4)的整数倍,所以输出8。
3、虽然共开辟了8个字节,但是只用了5个字节,剩余3个字节没有用。
注意
下图中这两种写法并不等价,这样写是为了方便理解对齐数那里。
第一个arr占用5个字节(共用5个字节),第二个占用1个字节大小(共用1个字节)

例子:
union Un1
{char c[5];int i;
};union Un2
{char c1; char c2;char c3;char c4;char c5;int i;
};int main()
{printf("%d\n", sizeof(union Un1));//输出8printf("%d\n", sizeof(union Un2));//输出4return 0;
}
六、联合的应用(判断大小端)
可以通过联合体,可以在不使用额外内存的情况下,判断计算机是大端存储还是小端存储。
代码如下:
#include <stdio.h>int check_sys()
{union{int i;char c;}un;un.i = 1;return un.c; //返回1是小端,返回0是大端
}int main()
{int ret = check_sys();if (ret == 1){printf("小端\n");}else {printf("大端\n");}
}
分析如下:

七、联合体的优缺点
7.1 优点
1、节省空间:
联合体可以最大程度地节省内存,特别是当有多个变量是同一类型的时候。
2、数据类型之间的转换:
联合体可以用于在不同的数据类型之间转换。
联合体的数据之间的转换是指将联合体的一个成员转换为另一个成员的过程。
数据之间的转换可以通过强制类型转换或直接访问成员来实现。
7.2 缺点
1、不安全:
联合体不提供任何形式的数据隔离,这意味着一个变量可以覆盖另一个变量的数据。所以在访问联合体成员时,需要保证访问的成员与最后一次赋值的成员类型相同,否则可能会出现数据错误或不可预期的结果。
2、可移植性问题:
不是所有的系统对联合体中的对齐做出相同的保证,这可能导致在一个系统上运行正常的代码在另一个系统上出现问题。
相关文章:
【C语言】联合(共用体)
目录 一、什么是联合体 二、联合类型的声明 三、联合变量的创建 四、联合的特点 五、联合体大小的计算 六、联合的应用(判断大小端) 七、联合体的优缺点 7.1 优点 7.2 缺点 一、什么是联合体 联合也是一种特殊的自定义类型。由多个不同类型的数…...
【博客715】如何从victorimametrics集群中下线vmstorage节点
How to Decommission a vmstorage Node from a VictoriaMetrics Cluster 我们需要从VictoriaMetrics 集群中优雅地移除一个 vmstorage 节点。每个 vmstorage 节点都包含自己的数据部分,从集群中移除 vmstorage 节点会导致图表出现空白(因为复制超出了范…...
Redis缓存技术详解与实战
Redis缓存技术详解与实战 Redis作为一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。在现代高并发、大数据量处理的系统中,Redis作为缓存层的应用越来越广泛。本文将详细讲解Redis在查询、添加缓存、更新缓存、缓存预热、缓存穿透、…...
业务架构的位置及关系
背景 我们已经了解了业务架构的核心元素组成,以及各个扩展元素,同时对各个元素的关系协同也有了一些了解,那么接下来,我们进一步在宏观层面来看业务架构与其他架构的关系。 企业架构 企业架构有多种理解,也有多种叫…...
CMS与AI的融合:构建万能表单小程序系统
引言: 随着人工智能技术的飞速发展,MyCMS作为一款功能强大的内容管理系统,通过集成AI技术,进一步拓展了其应用范围和智能化水平。本文将探讨如何利用MyCMS结合AI技术,构建一个能够将用户提交的万能表单数据转化为智能提…...
机器学习常见知识点 2:决策树
文章目录 决策树算法1、决策树树状图2、选择最优决策条件3、决策树算法过程→白话决策树原理决策树构建的基本步骤常见的决策树算法决策树的优缺点 【五分钟机器学习】可视化的决策过程:决策树 Decision Tree 关键词记忆: 纯度、选择最优特征分裂、熵、基…...
海洋CMS admin_notify.php 远程代码执行漏洞复现(CVE-2024-30565)
0x01 产品简介 海洋CMS是一套专为不同需求的站长而设计的内容管理系统,灵活、方便、人性化设计、简单易用是最大的特色,可快速建立一个海量内容的专业网站。海洋CMS基于PHP+MySql技术开发,完全开源免费 、无任何加密代码。 0x02 漏洞概述 海洋CMS admin_notify.php 接口处…...
Spring、Spring MVC、MyBatis和Spring Boot对比
在对比Spring、Spring MVC、MyBatis和Spring Boot时,我们可以从以下几个方面进行详细的分析: Spring框架: 作用:Spring是一个轻量级的IoC(控制反转)和AOP(面向切面编程)容器&#…...
【Linux高级IO】select、poll、epoll
【Linux高级IO】select、poll、epoll toc 作者:爱写代码的刚子 时间:2024.6.5 前言:本篇博客将会介绍面试重点考察的select、poll、epoll IO: input && Output read && write 应用层read&&write的时候,…...
Etcd Raft架构设计和源码剖析2:数据流
Etcd Raft架构设计和源码剖析2:数据流 | Go语言充电站 前言 之前看到一幅描述etcd raft的流程图,感觉非常直观,但和自己看源码的又有些不同,所以自己模仿着画了一下,再介绍一下。 下图从左到右依次分为4个部分&…...
深入理解Qt多线程编程(QThreadPool)
多线程编程在现代软件开发中变得越来越重要,它能够提高应用程序的响应速度和处理性能。在Qt框架中,QThreadPool作为线程池管理工具,被频繁的使用。 目录 概述 接口介绍 底层原理解析 使用方法 概述 QThreadPool是Qt提供的一个线程池实现&a…...
Prisma数据库ORM框架学习
初始化项目 中文网站 点击快速开始,点击创建sql项目,后面一步一步往后走 这个博主也挺全的,推荐下 可以看这个页面初始化项目跟我下面是一样的,这里用得是ts,我下面是js,不需要额外的配置了 1.vscode打开一个空文件夹 2.npm init -y 初始化package.json 3.安装相关依赖 …...
Flutter-使用MethodChannel 实现与iOS交互
前言 使用 MethodChannel 在 Flutter 与原生 Android 和 iOS 之间进行通信,可以让你在 Flutter 应用中调用设备的原生功能。 基础概念 MethodChannel:Flutter 提供的通信机制,允许消息以方法调用的形式在 Flutter 与原生代码之间传递。方法…...
【星海随笔】云解决方案学习日志篇(一) ELK,kibana,Logstash安装
心路历程 本来想最近再研究研究DPDK的。但是自己做一个东西很多时候没有回报。因为自己的低学历问题,类似工作的面试都没有。所以很多东西学了很快就忘了,没有地方可以用。 今天看到了一个大佬,除了发型外,很多想法还是很共鸣的。 Shay Banon 决定开始跟…...
【leetcode】hot100 哈希表
1. 两数之和 1.1 题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。…...
每日5题Day22 - LeetCode 106 - 110
每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {…...
【Python】读取文件夹中所有excel文件拼接成一个excel表格 的方法
我们平常会遇到下载了一些Excel文件放在一个文件夹下,而这些Excel文件的格式都一样,这时候需要批量这些文件合并成一个excel 文件里。 在Python中,我们可以使用pandas库来读取文件夹中的所有Excel文件,并将它们拼接成一个Excel表…...
7. 通配符和正则表达式
文章目录 7.1 通配符7.1.1 通配符介绍7.1.2 通配符示例 7.2 正则表达式7.2.1 grep命令7.2.2 基本正则表达式7.2.3 扩展正则表达式 7.1 通配符 在 Shell 中通配符用于查找文件名和目录名。它是由 Shell 处理的,只会出现在命令的参数中。 7.1.1 通配符介绍 * 匹…...
ROS2底层机制源码分析
init ->init_and_remove_ros_arguments ->init ->Context::init 保存初始化传入的信号 ->install_signal_handlers→SignalHandler::install 开线程响应信号 ->_remove_ros_arguments 移除ros参数 ->SingleNodeManager::instance().…...
超越 Transformer开启高效开放语言模型的新篇章
在人工智能快速发展的今天,对于高效且性能卓越的语言模型的追求,促使谷歌DeepMind团队开发出了RecurrentGemma这一突破性模型。这款新型模型在论文《RecurrentGemma:超越Transformers的高效开放语言模型》中得到了详细介绍,它通过…...
404 Not Found 与 500 Internal Server Error 全方位解析
前言在日常开发与运维中,HTTP 状态码是我们最常打交道的一类信号。其中,404 与 500 两类错误几乎占据了线上问题的一半以上。你是否遇到过:用户反馈页面打不开,浏览器提示 404 Not Found,但实际上资源明明存在…...
PheroPath:自定义代谢通路构建与可视化工具在组学数据分析中的应用
1. 项目概述与核心价值最近在生物信息学和计算生物学领域,一个名为“PheroPath”的项目引起了我的注意。这个项目由用户starpig1129托管,从名字上就能嗅到一丝“信息素”和“路径”结合的味道。作为一名长期在组学数据分析、特别是代谢通路研究一线摸爬滚…...
如何将Claude Code的配置无缝迁移至Taotoken平台以解决封号困扰
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何将Claude Code的配置无缝迁移至Taotoken平台以解决封号困扰 Claude Code 作为一款高效的编程助手,其核心能力依赖于…...
STM32+原理图+PCB程序直流充电桩主控方案源
💥💥💞💞欢迎来到本博客❤️❤️💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭:行百…...
602 游戏平台 — 做玩家喜爱、信任的游戏平台!
602 游戏是2013 年上线的老牌正规页游平台,十年稳定运营,始终以 “玩家喜爱、信任”为核心,主打传奇类精品页游 ,三端互通✅ 平台核心优势(为什么玩家信任)正规合规,账号安全:文网文…...
按类型搜索文件
rg -n "getState" --typec --typejava...
模函数激活:挑战ReLU的极致简洁方案,为CV与TinyML带来性能突破
1. 项目概述:为什么我们需要重新审视激活函数?在深度学习的工具箱里,激活函数可能是最不起眼,却又最不可或缺的部件。它就像神经网络中的“开关”或“阀门”,决定了每个神经元是否被激活,以及激活的程度。长…...
论文降AIGC教程:从标红区到安全线,2026最新3步攻略与工具测评
今年的交稿季有一点很磨人:除了文章重复率,AIGC检测率几乎也成了各处的标配,很多小伙伴接到通知直接懵了。 我之前也有过长文盲改失败的经历:刚拿到初稿就开始一通操作,觉得把文段里面的词语换换同义词就行࿰…...
OpenClaw 接入微信 / 企业微信完整教程
本文介绍如何通过 OpenClaw 框架,将个人微信和企业微信接入 AI Agent,实现「AI 自动回复」的功能。适用于树莓派、Mac/Windows 电脑、NAS 或云服务器等各类设备。 一、环境准备 1.1 安装 OpenClaw OpenClaw 是核心运行环境,负责加载插件、管…...
企业组网实战:用爱快+水星AC打造跨地域无线网络,远程管理分支AP就这么简单
企业级无线组网实战:跨地域统一管理与远程控制方案 在数字化转型浪潮中,中小企业对无线网络的依赖程度越来越高。无论是总部办公室、分支机构还是临时办公点,稳定、安全且易于管理的无线网络已成为企业高效运营的基础设施。然而,…...
