当前位置: 首页 > news >正文

C复习-结构struct+bit field+union

参考: 里科《C和指针》


结构的声明

struct {int a;char b;
} x;
struct {int a;char b;
} y[20], *z;// 会报错,因为z和x虽然都没有名字,但是并不是一个东西
z = &x;struct SIMPLE {int a;char b;
};
// 这样就对了,因为名字匹配
struct SIMPLE x;
struct SIMPLE* z = &x;// 这样写也ok. 此时SIMPLE是类型名,而非结构体标签,因此可以直接用
typedef struct {int a;char b;
} SIMPLE;
SIMPLE x;
SIMPLE* z = &x;

结构体不能自引用(不能包含同结构成员),但可以包含指向同结构的指针。

struct SELF_REF1 {int a;struct SELF_REF1 b;
}; // 这个会报错,因为SELF_REF1的定义永远在递归,永远没有完成struct SELF_REF2 {int a;struct SELF_REF2 *b; 
}; // 这个是正确的,因为b的长度确定typedef struct {int a;SELF_REF3 *b;
} SELF_REF3; // 这个会报错,因为定义b时还没有SELF_REF3typedef struct SELF_REF3_TAG {int a;struct SELF_REF3_TAG *b;
} SELF_REF3; // 这样是正确的

如果两个结构需要互相依赖(比如一个结构需要包含另一个结构的几个成员),那么至少要有一个结构必须在另一个结构中以指针的形式存在。此时使用不完整声明incomplete declaration。

// 先不完整声明B
struct B;struct A {struct B *partner;...
};struct B {struct A *partner;...
};

结构的初始化

类似数组,用嵌套的大括号。如果初始列表的值不够,剩余的会采用缺省值。

struct INIT_EX {int a;short b[10];Simple c;
} x = {10,{1, 2, 3},{4, 'x'}
};

结构成员的访问

结构成员的直接访问用 . ,间接访问(通过指向结构的指针访问成员)使用 → 。

→的优先级高于&和*

typedef struct {int a;short b[2];
} Ex2;
typedef struct EX {int a;char b[3];Ex2 c;struct Ex *d;
} Ex;
// 此时指针d是NULL
Ex x = { 10, "Hi", { 5, {-1, 25} }, 0 };
Ex *px = &x;// ->优先级高于&所以不用括号
int *pi = &px->a;
int val = px->c.a;
int val2 = *px->c.b; // -1
// *px->d 会报错,所以对指针进行解引用之前一定要检查是否有效

结构存储空间的分配

编译器按照成员列表的顺序分配空间,如果存储时需要满足边界对齐要求,那么成员之间可能出现空白。比如一个机器int占4字节,起始存储位置必须被4整除,系统禁止编译器在struct的起始位置跳过字节来满足对齐要求,那么,对一个结构:

struct ALIGN {char a;int b;char c;
};

其存储结构如下,第一块的第一个字节存a,随后空3个字节,再开始存b,然后进入第三块,第一个字节存c,随后空3个字节。这样可以满足对齐要求,但需要12个字节,空6个。

□■■■|□□□□|□■■■

此时如果重新排列,使得int b在第一行,那么前4个字节可以存b,然后再来4个字节存a和c,最后跳过2个,此时只需要8个字节,空2个。

如果结构数目较少,为了可读性可以将相关的放在一起,但如果有成百上千个结构,为了减少内存浪费,应该考虑重排成员。

使用sizeof可以看整体占的字节数,offsetof则能看到struct某个元素在第几个字节。

#include <stddef.h>
typedef struct {int b;char a;char c;
} ALIGN;int main()
{printf("%d\n", sizeof(ALIGN)); // 8printf("%d\n", offsetof(ALIGN, c)); // 5 return 0;
}

作为函数参数

直接传struct效率很低,因为需要制造拷贝,复制到堆栈中再丢弃。因此一般是传递指针。(除非结构特别特别小,即长度和指针相同或更小)

为了进一步提升效率,可以把参数声明为寄存器变量(如果函数对这个指针的间接访问超过3次,会更省时);同时为了避免修改指针,可以声明为const

// Transaction是一个结构体,这个函数用来打印其中的成员。使用->访问成员
// 如果函数里需要修改某个成员,就去掉const
void print(register Transaction const *trans);

位段bit field

类似struct,但是成员占一个或多个位,最终存储在一个或多个整型变量中。位段的成员只能是int、signed int或unsigned int(最好只用signed和unsigned,因为int被解释为有符号还是无符号是编译器决定的),并且要指明位数。

如果要保证可移植性,那么不要用位段。

优点是可以将长度为奇数的数据包装在一起,节省存储空间;可以很方便地访问一个整型值的部分内容,比如在os中与磁盘控制器通信,方便进行位操作。

struct CHAR {unsigned ch : 7;unsigned font : 6;unsigned size : 19;
};
struct CHAR ch1;

联合Union

union的成员引用的是内存中的相同位置,所以适合不同时刻在同一位置存储不同东西的情况。如果成员们长度不同,union的长度就是最长的成员的长度。

初始化时,初始值必须是第一个成员的类型,如果不符合,会被转换。

union {float f;int i;
} fi = { 1.0f };

相关文章:

C复习-结构struct+bit field+union

参考&#xff1a; 里科《C和指针》 结构的声明 struct {int a;char b; } x; struct {int a;char b; } y[20], *z;// 会报错&#xff0c;因为z和x虽然都没有名字&#xff0c;但是并不是一个东西 z &x;struct SIMPLE {int a;char b; }; // 这样就对了&#xff0c;因为名字匹…...

1 快速了解Paimon数据湖核心原理及架构

1.1 什么是Apache Paimon Apache Paimon的前身属于Flink的子项目&#xff1a;Flink Table Store。 目前业内主流的数据湖存储项目都是面向批处理场景设计的&#xff0c;在数据更新处理时效上无法满足流式数据湖的需求&#xff0c;因此Flink社区在2022年的时候内部孵化了 …...

chrome v3开发插件实现所有网站允许跨域

场景&#xff1a; chrome 插件 升级到v3后&#xff0c;原来修改请求响应都变成异步&#xff0c;即无法同步拦截来修改请求响应。 在v3中也不支持修改请求响应内容。 问题&#xff1a;如何在chrome v3中允许其他网站跨域呢。 方式一&#xff1a;禁用chrome跨域&#xff0c;禁…...

unity Holoens2开发,使用Vuforia识别实体或图片 触发交互

建议&#xff1a;先看官方文档 我使用的utniy 版本&#xff1a;Unity 2021.3.6f1 官方建议&#xff1a;混合现实工具包简介 - 设置项目并使用手势交互 - Training | Microsoft Learn 配置了正确工具的 Windows 10 或 11 电脑Windows 10 SDK 10.0.18362.0 或更高版本安装了 U…...

从零开始搭建微服务(一)

构建项目父工程 添加公共核心模块 安装nacos 安装nacos nacos 文档地址&#xff1a; https://nacos.io/zh-cn/docs/what-is-nacos.html 本文使用版本2.2.2 下载地址&#xff1a;https://github.com/alibaba/nacos/archive/refs/tags/2.2.2.zip 使用nacos 我们下载是源代码 解…...

一种可以实现安全便捷文件摆渡的跨网文件安全交换软件

为了保护数据的安全性和完整性&#xff0c;很多企业都采用了内外网物理隔离的方式&#xff0c;防止核心数据泄露或被恶意篡改。然而&#xff0c;这也给企业内部或与外部合作伙伴之间的文件交换带来了很多不便和挑战。如何在保证数据安全的前提下&#xff0c;实现跨网文件的快速…...

『 MySQL数据库 』数据库基础之表的基本操作

文章目录 创建表&#x1f5e1;查看表&#x1f5e1;✒ 查看表内所有信息(描述\表结构等)✒ 根据条件查看表内数据✒ 查看表的具体详细信息: 修改表&#x1f5e1;✒ 修改表名:✒ 修改表的存储引擎、编码集(字符集和校验集):✒ 表内插入数据:insert into✒ 在表中新添一个字段(列)…...

如何提高40%的Docker构建时间

1. 背景 在产品开发中构建docker镜像,随着时间的推移,会变得越来越大,构建时间也越来越长。我的目标是构建时间不超过 5 分钟。 2. 遵循Dockerfile的最佳实践 我们首先确保Dockerfile文件遵循Docker官方的最佳实践,具体做法有: 尽量使用官方的基础镜像,Docker推荐使用…...

真正解决jellyfin硬解码转码

前段时间入手一个DS423集成显卡UHD600&#xff0c;搭了一个jellyfin&#xff0c;发现网上关于硬解码的教程基本都存在问题&#xff0c;没有真正解决我的硬解码问题。经过一系列分析修改&#xff0c;最终实现硬解码。先贴效果图&#xff1a; 下载安装jellyfin这里就不叙述&#…...

声音训练数据集哪里找?中文、英文

一般找数据集的都是需要训练底膜的&#xff0c;大家git上找的开源项目大多是预训练模型。预训练就是别人已经训练好的底膜&#xff0c;你在他的基础上进行调整。而我们训练如果他这个模型不理想是需要训练底膜的。 找的方式是从git开源上找 中文 推荐MockingBird&#xff0c;…...

springboot中如何同时操作同一功能

问题描述 测试阶段&#xff0c;由于存在某一功能的同时操作&#xff0c;该功能还是入库逻辑&#xff0c;此时若不进行处理&#xff0c;会造成插入表中多条重复数据&#xff0c;为此该问题需要修复。 解决办法 在接口开始进行对是否存在某个key值的判断&#xff0c;若不存在&…...

YOLOWeeds: 用于棉花生产系统中多类杂草检测的 YOLO 目标检测器的新基准

YOLOWeeds: A novel benchmark of YOLO object detectors for multi-class weed detection in cotton production systems 摘要1、介绍2、总结 摘要 过度依赖除草剂控制杂草&#xff0c;加速了杂草的抗除草剂进化&#xff0c;引起了对环境、食品安全和人类健康的日益关注。自动…...

Vue3:自定义图标选择器(包含 SVG 图标封装)

文章目录 一、准备工作&#xff08;在 Vue3 中使用 SVG&#xff09;二、封装 SVG三、封装图标选择器四、Demo 效果预览&#xff1a; 一、准备工作&#xff08;在 Vue3 中使用 SVG&#xff09; 本文参考&#xff1a;https://blog.csdn.net/houtengyang/article/details/1290431…...

NIO讲解

一&#xff1a;什么是NIO? 二&#xff1a;NIO三大组件 1. channel channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 stream 要么是输入…...

react中jest配置,解决node_modules报错esm无法解析的问题

重点关注&#xff1a; transformIgnorePatterns: [ "/node_modules/(?!(?:jmfe)/)", ], moduleNameMapper: { "\\.(css|less|scss|sss|styl)$": "jest-css-modules" } 并安装jest-css-modules&#xff08;npm i --save-dev jest-css-mo…...

Qt6,使用 UI 界面完成命令执行自动化的设计

一、需要完成的功能 在子对话框&#xff08;CmdChildQt&#xff09;中&#xff0c;点击 “执行” 按钮&#xff0c;将多个命令行指令&#xff0c;依次输入到父对话框&#xff08;CmdQt&#xff09;的编辑框中并且执行&#xff0c;要求如下&#xff1a; 在前一个命令执行完成后&…...

Apache Maven;会话技术

Apache Maven是一个项目管理和构建工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;的概念&#xff0c;通过一小段描述信息来管理项目的构建、报告和文档。 Maven模型有&#xff1a; 项目对象模型、依赖管理模型、插件 会话技术&#xff1a; 会话&#xff1a…...

Azure - 机器学习:使用自动化机器学习训练计算机视觉模型的数据架构

目录 一、用于训练的数据架构图像分类&#xff08;二进制/多类&#xff09;多标签图像分类对象检测实例分段 二、用于推理的数据格式输入格式输出格式图像分类多标签图像分类对象检测实例分段 了解如何设置Azure中 JSONL 文件格式&#xff0c;以便在训练和推理期间在计算机视觉…...

【C++】stack | queue | priority_queue | deque

一、stack栈 介绍 1.栈是一种特殊的线性表&#xff0c;其元素遵循“后进先出”的原则&#xff0c;即仅允许在在表的一端进行插入、删除操作&#xff0c;这一模式被称为“后进先出”或LIFO&#xff08;last in fisrt out&#xff09;。 2.从底层实现来看&#xff0c;stack是作…...

华为gre带验证key案例

配置FW_A。 a.配置接口的IP地址&#xff0c;并将接口加入安全区域。 system-view [sysname] sysname FW_A [FW_A] interface GigabitEthernet 1/0/1 [FW_A-GigabitEthernet1/0/1] ip address 1.1.1.1 24 [FW_A-GigabitEthernet1/0/1] quit [FW_A] interface GigabitEthernet 1/…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...