浅析 C 语言的共用体、枚举和位域
前言
最近在尝试阅读一些系统库的源码,但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅,发现是 C 语言中的共用体和位域。于是,趁着课本还没有扔掉,将一些相关的知识点记录在本文。
文章目录
- 前言
- 共用体 (union)
- 枚举 (enum)
- 位域
- 参考资料
共用体 (union)
公用体和结构体相似,也是一种数据构造机制。但是结构体中的各成员变量顺序排列存储,每个成员变量都有自己独立存储空间,而共用体中所有成员变量共享同一片内存区域,一个共用体变量在每个时刻里只能保存它的某个成员变量的值。
定义格式如下:
union 共用体名 {成员列表
};
下面是共用体和结构体占用内存的情况:
#include <stdio.h>union UnionData {int a;float b;double c;char d;
};struct StructData {int a;float b;double c;char d;
};int main() {printf("%lu %lu\n", sizeof(UnionData), sizeof(StructData));return 0;
}
控制台输出结果:
8 24
共用体能支持在同一块内存区域对不同的数据类型进交替使用,增加了灵活性,节省了内存,通常在系统库中会有所应用。
枚举 (enum)
枚举 (enumeration) 是一系列命名的整型常量,它是一种基本数据类型,而不是一种构造类型。在“枚举”类型的定义中,我们需要列举出所有可能值,就像列举一周七天、一年四季等。
定义格式如下:
enum 枚举名 {枚举列表};
枚举的使用例子如下:
#include <stdio.h>// 枚举定义
enum Season {SeasonSpring = 1,SeasonSummer,SeasonAutumn, SeasonWinter
};int main () {Season a = SeasonSpring;switch (a) {case SeasonSpring:printf("SeasonSpring\n");break;case SeasonSummer:printf("SeasonSummer\n");break;case SeasonAutumn:printf("SeasonAutumn\n");break;case SeasonWinter:printf("SeasonWinter\n");break;}return 0;
}
控制台输出结果:
1 2 3
位域
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。
出于节省内存的角度考虑,就有了位域这种设计。位域是 C 语音中一种特殊的结构体成员,它允许我们指定它所占的内存位数。
定义格式如下:
struct 位域结构名 {类型说明符 位域名 : 位域长度;
};
说明:
- 一个位域必须存储在同 1 个字节中,不能跨两个字节。如果一个字节所剩的空间不足以存储下一个位域时,应该从下一个字节开始存储。
- 位域长度不能大于 1 个字节长度,也就是说不能超过 8 位。
- 位域的数据类型只能是 int、unsigned int、char、枚举等类型。
- 位域可以没有位域名,因为无名的位域是不能使用的,所以只是用作填充或调整位置的作用。例如:
struct BitStruct {int a : 4;int : 2; // 空域,不能使用int b : 4;int c : 4; }
参考资料
- https://www.runoob.com/cprogramming/c-bit-fields.html
- https://book.douban.com/subject/26792521/
本文主要对 C 语言中,共用体、枚举和位域等三块内容做简单介绍,涉及到他们在工程中应用的方面很少,如果后面阅读系统源码的过程遇到了,会再做进一步补充。
相关文章:

浅析 C 语言的共用体、枚举和位域
前言 最近在尝试阅读一些系统库的源码,但是其中存在很多让我感到既熟悉又陌生的语法。经过资料查阅,发现是 C 语言中的共用体和位域。于是,趁着课本还没有扔掉,将一些相关的知识点记录在本文。 文章目录 前言共用体 (union)枚举…...

TartanVO: A Generalizable Learning-based VO 论文阅读
论文信息 题目:TartanVO: A Generalizable Learning-based VO 作者:Wenshan Wang, Yaoyu Hu 来源:ICRL 时间:2021 代码地址:https://github.com/castacks/tartanvo Abstract 我们提出了第一个基于学习的视觉里程计&…...

单例模式-java实现
介绍 单例模式的意图:保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图:一般的单例的实现,是属性中保持着一个自己的私有静态实例引用,还有一个私有的构造方法,然后再开放一个静态的获取实例的方法给外界…...
篇八:装饰器模式:动态增加功能
篇八:“装饰器模式:动态增加功能” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,…...

算法通关村第五关——n数之和问题解析
1. 两数之和问题 力扣第1题就是两数之和问题,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一…...

小白到运维工程师自学之路 第七十集 (Kubernetes集群部署)
一、概述 Kubernetes(简称K8S)是一个开源的容器编排和管理平台,是由Google发起并捐赠给Cloud Native Computing Foundation(CNCF)管理的项目。它的目标是简化容器化应用的部署、扩展、管理和自动化操作。 以下是Kube…...

docker 部署mysql 5.6集群
docker搭建mysql的集群(一主双从) 1.拉取镜像 docker pull mysql:5.6 2.启动master容器 docker run -it -d --name mysql_master -p 3306:3306 --ip 192.168.162.100 \ -v /data/mysql_master/mysql:/var/lib/mysql \ -v /data/mysql_master/conf.d…...
mysql基本信息查询
1.查看mysql表的数据量 select table_schema as 数据库, table_name as 表名, table_rows as 记录数, truncate(data_length/1024/1024, 2) as 数据容量(MB), truncate(index_length/1024/1024, 2) as 索引容量(MB) from information_schema.tables order by data_length des…...
C语言初学者必读:使用for循环将数字从大到小排序并输出
在学习C语言编程的过程中,了解数组的输入和排序是非常基础且重要的一部分。本文将以通俗易懂的方式,教你如何使用for循环实现将输入的n个数字按照从大到小的顺序输出,帮助你逐步掌握数组的使用和排序算法。 第一步:获取用户输入 …...

【Vue+Element-plus】记录后台首页多echart图静态页面
一、页面效果 二、完整代码 Index.vue <template><div><div><DateTime /><!-- {{username}} --></div><el-row :gutter"20"><el-col :span"8"><div class"grid-content bg-purple"><P…...

BM5 合并k个已排序的链表 javascript
描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 数据范围: 示例1 输入: [{1,2,3},{4,5,6,7}] 返回值: {1,2,3,4,5,6,7}示例2 输入: [{1,2},{1,4,5},{6}] 返回值: {1,1,2,4,5,6}解题思路 利用两个…...

1.利用matlab建立符号表达式(matlab程序)
1.简述 、 1. 使用sym命令创建符号变量和表达式 语法: sym(‘变量’,参数) %把变量定义为符号对象 说明:参数用来设置限定符号变量的数学特性,可以选择为’positive’、’real’和’unreal’, ’positive’ 表示为“正、实”符…...

LVS工作环境配置
一、LVS-DR工作模式配置 模拟环境如下: 1台客户机 1台LVS负载调度器 2台web服务器 1、环境部署 (1)LVS负载调度器 yum install -y ipvsadm # 在LVS负载调度器上进行环境安装 ifconfig ens33:200 192.168.134.200/24 # 配置LVS的VIP…...

金蝶,「起舞」在大模型时代
在过去的几年时间里,基于EBC的平台能力,金蝶已经走出了一个新的进化之路,这条路是对自身产品竞争力的重新构建,也更是对企业数字化转型需求的更大程度满足。 如今,苍穹GPT大模型更是让这种竞争力和服务力更向前一步。…...

解决Vs Code工具开发时 保存React文件时出现乱码情况
Vs Code工具开发时 保存React文件时出现乱码情况 插件库搜索:JS-CSS-HTML Formatter 把这个插件禁用或者卸载就解决保存时出现乱码的问题了; 如果没有解决,再看下面方案! 出现乱码问题通常是因为文件的编码格式不正确。您可以尝试以下解决方法: 确认文件编码格式&a…...

Fastjson 使用指南
文章目录 Fastjson 使用指南0 简要说明为什么要用JSON?用JSON的好处是什么?为什么要用JSON?JSON好处 1 常用数据类型的JSON格式值的范围 2 快速上手2.1 依赖2.2 实体类2.3 测试类 3 常见用法3.1 序列化操作核心操作对象转换为JSON串list转换J…...

阿里云内容审核服务使用(图片审核)
说明:在项目中,我们经常会对用户上传的内容(如文字、图片)等资源内容进行审核,审核包括两方面,一方面是内容与描述不符,一方面是违反法律法规。本文介绍使用阿里提供的内容审核服务,…...
git撤回最近一次push操作
git push -f origin HEAD^:branch_name其中,branch_name 是你想要撤回 push 操作的分支的名称。 这个命令将会强制推送到远程仓库,将远程分支回滚到上一个提交(HEAD^ 意味着上一个提交)。这样做会丢失最近一次 push 的更改&#…...

2000-2022年上市公司环境不确定性(原始数据+测算代码+测算结果)
2000-2022年上市公司环境不确定性指数(含原始数据 代码和计算结果) 1、时间:2000-2022年 2、指标:gupiao代码、名称、日期、年份、总资产净利润率ROA、营业收入、上市日期、成立日期、行业代码、年末是否ST或PT、行业、EU未调整…...

网络基本概念
目录 一、IP地址 1. 概念 2. 格式 3. 特殊IP 二、端口号 1.概念 2. 格式 3.注意事项 三、 协议 1. 概念 2. 作用 四、协议分层 1. 网络设备所在分层 五、封装与分用 六、客户端和服务器 1. 客户端与服务器通信的过程 一、IP地址 1. 概念 IP地址主要用于标识网络主机.其他网络…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...