详解下c语言中struct和union的对齐规则
接触过c语言的同学应该都知道字节对齐。有些时候我们很容易弄错字节对齐的方式,特别是涉及到struct(结构体)和union(联合体)时。今天我们通过详细例子来说明下struct和union的对齐规则,以便了解各种struct和union所占字节具体计算方式。
一、基础环境信息
我本地计算机系统各类基础类型所占字节如下:
int main() {printf("the sizeof char is %d\n",sizeof(char));printf("the sizeof int is %d\n",sizeof(int));printf("the sizeof unsigned is %d\n",sizeof(unsigned));printf("the sizeof short is %d\n",sizeof(short));printf("the sizeof long is %d\n",sizeof(long));printf("the sizeof float is %d\n",sizeof(float));printf("the sizeof double is %d\n",sizeof(double));printf("the sizeof longlong is %d\n",sizeof(long long));}
二、结构体字节对齐
2.1,结构体对齐规则
结构体中寻找所有成员中占字节数最大成员,其余成员根据占字节数最大成员拼凑或者插入空位构成n个(n>=1)最大成员字节。
2.2,实例
上图例子实测:
int main() {struct stu{char a;int b;short c;char d;};struct stu s;printf("the sizeof s is %d\n", sizeof s);printf("the address a is %x\n", &s.a);printf("the address b is %x\n", &s.b);printf("the address c is %x\n", &s.c);printf("the address d is %x\n", &s.d);
}
对于如下结构体:最大类型为b,占4字节,c,d,a拼凑占4字节,总共8字节
struct stu{int b;short c;char d;char a; };
int main() {struct stu{int b;short c;char d;char a;};struct stu s;printf("the sizeof s is %d\n", sizeof s);printf("the address b is %x\n", &s.b);printf("the address c is %x\n", &s.c);printf("the address d is %x\n", &s.d);printf("the address a is %x\n", &s.a);
}
对于如下结构体: f为最大类型,占8字节,成员e需要以8字节对齐,所以stu1占16字节;成员b,c,d拼凑占8字节;成员a分配8字节进行对齐;总共占32字节
struct stu{int b;short c;char d;struct stu1{char e;double f;} stu1;char a; };
int main() {struct stu{int b;short c;char d;struct stu1{char e;double f;} stu1;char a;};struct stu s;printf("the sizeof s is %d\n", sizeof s);printf("the address b is %x\n", &s.b);printf("the address c is %x\n", &s.c);printf("the address d is %x\n", &s.d);printf("the address stu1 is %x\n", &s.stu1);printf("the address e is %x\n", &s.stu1.e);printf("the address f is %x\n", &s.stu1.f);printf("the address a is %x\n", &s.a);
}
三、联合体字节对齐
3.1,联合体对齐规则
联合体字节对齐计算非常简单,为所有成员中所占字节最大成员的字节数。
3.2,实例
上图例子实测:
int main() {union stu{char a;int b;short c;char d;};union stu s;printf("the sizeof s is %d\n", sizeof s);printf("the address b is %x\n", &s.b);printf("the address c is %x\n", &s.c);printf("the address d is %x\n", &s.d);printf("the address a is %x\n", &s.a);s.b = 0b00000011000000110000001100000011;printf("the value of b is %d\n", s.b);printf("the value of c is %d\n", s.c);printf("the value of d is %d\n", s.d);printf("the value of a is %d\n", s.a);
}
对于如下联合体:stu中成员stu1按照struct对齐规则占8字节,所以联合体stu占8字节。
union stu{char a;int b;short c;struct stu1{char e;int f;}stu1;char d; };
int main() {union stu{char a;int b;short c;struct stu1{char e;int f;}stu1;char d;};union stu s;printf("the sizeof s is %d\n", sizeof s);printf("the address a is %x\n", &s.a);printf("the address b is %x\n", &s.b);printf("the address c is %x\n", &s.c);printf("the address e is %x\n", &s.stu1.e);printf("the address f is %x\n", &s.stu1.f);printf("the address d is %x\n", &s.d);}
相关文章:

详解下c语言中struct和union的对齐规则
接触过c语言的同学应该都知道字节对齐。有些时候我们很容易弄错字节对齐的方式,特别是涉及到struct(结构体)和union(联合体)时。今天我们通过详细例子来说明下struct和union的对齐规则,以便了解各种struct和…...
ubuntu安装sublime安装与免费使用
1. ubuntu安装sublime 参考官网: Linux Package Manager Repositories 2. 破解过程 打开如下网址,打开/opt/sublime_text/sublime_text https://hexed.it/ 3. 替换在hexed打开的文件中查找并替换: 4180激活方法 使用二进制编辑器 8079 0500 0f94 c2替换为 c641 05…...

攻防世界 cookie
开启场景 Cookie(HTTP cookie)是一种存储在用户计算机上的小型文本文件。它由网站通过用户的浏览器在用户访问网站时创建,并存储一些用于跟踪和识别用户的信息。Cookie 主要用于在网站和浏览器之间传递数据,以便网站可以根据用户的…...

深度学习笔记1:神经网络与模型训练过程
参考博客:PyTorch深度学习实战(1)——神经网络与模型训练过程详解_pytorch 实战-CSDN博客 人工神经网络 ANN:张量及数学运算的集合,排列方式近似于松散的人脑神经元排列 组成 1)输入层 2)隐…...

什么是 DevOps 自动化?
DevOps 自动化是一种现代软件开发方法,它使用工具和流程来自动化任务并简化工作流程。它将开发人员、IT 运营和安全团队聚集在一起,帮助他们有效协作并交付可靠的软件。借助 DevOps 自动化,组织能够处理重复性任务、优化流程并更快地将应用程…...
使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler
操作数据库是非常常见的需求,使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类,并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类,用于简化…...

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等
DB-GPT V0.6.3版本现已上线,快速预览新特性: 新特性 1. 支持 SiliconCloud 模型,让用户体验多模型的管理能力 如何使用: 修改环境变量文件.env,配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…...

亚式期权定价模型Turnbull-Wakeman进行delta对冲
Turnbull-Wakeman Model是一种用于定价和对冲亚式期权的数学模型。该模型由David Turnbull和Keith Wakeman在1990年提出,用于解决亚式期权的定价问题。 亚式期权是一种路径依赖类型的期权,其期权价格与标的资产价格某个期间内的平均值有关,假…...

Java的list中状态属性相同返回true的实现方案
文章目录 项目背景方案一、for循环实现实现思路 方案二、stream实现实现思路 项目背景 在项目中会遇到list中多个状态判断,状态值相等时,总体返回为true。 方案一、for循环实现 实现思路 遍历list,当出现不一致时,直接跳出循环…...

在 React 项目中安装和配置 Three.js
React 与 Three.js 的结合 :通过 React 管理组件化结构和应用逻辑,利用 Three.js 实现 3D 图形的渲染与交互。使用这种方法,我们可以在保持代码清晰和结构化的同时,实现令人惊叹的 3D 效果。 在本文中,我们将以一个简…...
服务器压力测试怎么做
在部署任何Web应用程序或服务之前,进行服务器压力测试(也称为负载测试)是确保系统能够处理预期用户流量的关键步骤。通过模拟大量并发请求,可以评估服务器的性能、稳定性和响应时间,识别潜在瓶颈,并优化资源…...

TCN-Transformer+LSTM多变量回归预测(Matlab)添加气泡图、散点密度图
TCN-TransformerLSTM多变量回归预测(Matlab)添加气泡图、散点密度图 目录 TCN-TransformerLSTM多变量回归预测(Matlab)添加气泡图、散点密度图预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基本介绍 1.双路创新ÿ…...
Mac 查询IP配置,网络代理
常用命令 1.查询IP ifconfig | grep "inet" 2.ping查询 ping 172.18.54.19(自己IP) 3.取消代理,通过在终端执行以下命令,可以取消 Git 的代理设置 git config --global --unset http.proxy git config --global …...

Vue2五、商品分类:My-Tag表头组件,My-Table整个组件
准备: 安包 npm less less-loader。拆分:一共分成两个组件部分: 1:My-Tag 标签一个组件。2:My-Table 整体一个组件(表头不固定,内容不固定(插槽)) 一&…...

梯度下降法求六轴机械臂逆向解
梯度下降法求六轴机械臂逆向解 一、几何基础 对于上述六轴机械臂的数学建模来说,可以构建一个六轴机械臂的运动学正逆解的数学模型,在一个直角坐标系中有如下旋转矩阵: 绕x轴旋转 R x ( θ x ) [ 1 0 0 0 cos θ x sin θ x 0 − …...
【生成模型之九】Paint by Example: Exemplar-based Image Editing with Diffusion Models
论文:Paint by Example: Exemplar-based Image Editing with Diffusion Models 代码:https://github. com/Fantasy-Studio/Paint-by-Example 为了实现高质量的基于样本的图像编辑,我们引入了四项关键技术,即利用图像先验、强数据-mask增强、内容瓶颈CLIP class token和无…...

集成RabbitMQ+MQ常用操作
文章目录 1.环境搭建1.Docker安装RabbitMQ1.拉取镜像2.安装命令3.开启5672和15672端口4.登录控制台 2.整合Spring AMQP1.sun-common模块下创建新模块2.引入amqp依赖和fastjson 3.新建一个mq-demo的模块1.在sun-frame下创建mq-demo2.然后在mq-demo下创建生产者和消费者子模块3.查…...
PVE虚拟化平台之开启虚拟机IP显示方法
PVE虚拟化平台之开启虚拟机IP显示方法 一、PVE平台介绍1.1 PVE简介1.2 PVE特点1.3 PVE主要使用场景二、检查PVE环境2.1 环境介绍2.2 检查PVE和虚拟机状态三、虚拟机开启Qemu代理四、Linux虚拟机安装Guest-Agent4.1 进入虚拟机VNC控制台4.2 查看虚拟机IP五、Windows虚拟机安装Gu…...

子Shell及Shell嵌套模式
子Shell 概念 Shell子进程,Shell脚本是从上至下,从左至右依次执行每一行的命令及语句的,即执行完一个命令之后再执行下一个。如果在shell脚本中遇到子脚本(即脚本嵌套),就会先执行子脚本的内容,完成后再返回父脚本继…...

Onedrive精神分裂怎么办(有变更却不同步)
Onedrive有时候会分裂,你在本地删除文件,并没有同步到云端,但是本地却显示同步成功。 比如删掉了一个目录,在本地看已经删掉,onedrive显示已同步,但是别的电脑并不会同步到这个删除操作,在网页版…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...