页面版权所有©ob欧宝最新地址 地址:浙江省湖州市创业大道111号 123黔ICP备17003352号-3

网站地图杭州

解析C语言结构体字节如何对齐
产品名称

解析C语言结构体字节如何对齐

没有此类产品
项目详细介绍

  C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不使用宏#pragma pack,采用默认字节对齐方式。

  在一个结构体中第一个成员变量放在偏移为0的位置,以后的变量都存储在该变量占用字节数整数倍的地址上。

  这里我们定义了两个很简单的结构体,short占用2个字节,struct st我们一眼就知道大小了6个字节,但是struct st2呢?笔者电脑是64位,那么long占用8个字节,short占用2个字节。我们先来按照结论进行分析,在struct st2中成员变量a1在偏移0处存储且占用8个字节,成员变量a2占用2个字节,由于8是2的倍数,所以a2在偏移8的位置存储,又因为有结论2。

  我们根据结论2可以得出,struct st2必须占用8的倍数大小,所以struct st2总大小是16个字节,不足的后面补齐。现在我分别打印出struct st1和struct st2占用字节数大小和struct st2各个成员变量地址,观察是否和分析的一样。

  现在我们看一下输出结果,struct st如我们所愿占用6个字节大小,struct st2也按照我们分析的一样占用16个字节。我们在程序中定义了一个struct st2类型变量st_val2,从输出中可以看出变量st_val2的a1成员变量和st_val2变量地址一样,成员变量a2在偏移8处存储(0x c0 = 0xb8 + 8)。一切如我们所愿,看起来好像挺简单的,我们知道C语言有丰富的数据类型,下面我们再定义一个更复杂的结构体。

  这个结构体包含了大量数据类型成员变量,再复杂的结构体也能按照我们的结论分析到底占用了几个字节。

  在struct st3中int型成员变量a1占用4个字节,在偏移0处存储,char型成员变量a2占用2个字节那么应该放在2的倍数地址处存储,a1已经占用了4个字节,所以a2应该在偏移4的地址存储。

  short型成员变量a3占用2个字节,也应该放在2的倍数地址处存储,所以a3在偏移6的地址处存储,a2后面填充1个字节。

  long型成员变量a4占用8个字节,应该放在8的倍数地址上存储,前面我们已经知道a3在偏移6的地址处存储,且占用2个字节8 = 6 + 2,所以a4应该在偏移8的地址处存储。

  现在我们计算一下struct st3结构体占用空间大小,从a5偏移出计算16 + 1 = 17。在struct st3中最大成员变量占用8个字节,所以结构体总大小应该是8的倍数,最后结构体总大小是17 + 7 = 24,这里的7个字节在最后补齐。

  枚举类型变量和联合体类型变量都可以作为结构体的成员变量,在分析这些结构体占用大小时,分析方法和我们上面的一模一样,只需要把内部任何一种数据类型变量当做一个普通变量看待即可,但是结构体类型成员变量有点不一样,它不适用于结论2,我们举个例子。

  在struct st4中我们定义了一个struct st3类型成员变量,前面我们已经分析过了struct st3占用24个字节。成员变量a1占用3个字节,成员变量a2占用4个字节,所以a2存储在偏移4的地址上,在a1后面填充一个字节。成员变量a3占用8个字节,则a3存储在偏移8的地址上。那么结构体总共占用字节数大小是:8 + 8 + 24 = 40。

  这段代码里我们使用了#pagma pack宏,表示结构体按1字节对齐。也就是说结构体变量st_val3总大小是内部成员变量占用字节数总和,没有字节填充。

  文章出处:【微信号:AndroidPush,微信公众号:QNX】欢迎添加关注!文章转载请注明出处。

  大家上午好! 今天为大家讲解C语言“函数”深入剖析,请持续关注,会持续进行更新! 前期回顾: ...

  一、安川变频器故障代码表现形式安川变频器在出现故障代码时,一共有三种表现形式:1、故障检出故障时,会出现以下状况。LED ...

  1、增量PID的原理、增量PID的最后公式2、增量PID的代码;3、stm32F4实现调节电机的速度。1、增量PID代码//定义PI...

  这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与...

  富士变频器维修故障代码总结OC1 加速时过电流 电动机过电流,输出电路相间或对地短路,变频器输出电流瞬时值大于过电流检出值时,...

  三菱电机空调Power Multi故障代码一、通过遥控器自我诊断故障室内机组故障检测P1(无线遥控器蜂鸣器发出声音/运行指示灯闪烁次...

  ESP8266-ESP-01S前言新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段...

  编码器编码器的定义:在数字系统里,常常需要将某一信息(输入)变换为某一特定的代码(输出)。把二进制码按一定的规律编排...

  以下为三菱变频器常见的故障代码以及故障说明HOLD 操作面板锁定Er1~4 参数写入错误rE1~4 拷贝操作错误Err .错误OL 失...

  #include#include#define uchar unsigned char#define uint unsigned intuchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,...

  在你的C语言代码中,不知能否看到类似下面的代码: 这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们....

  先解决两个疑问 ◆ 指针和引用的不同之处是什么? ◆ 何时用用指针?何时用引用? 指针和引用的不同之....

  开头的话 嵌入式开发是一个比较苦、容易背锅、可能仍然需要996而且拿钱较少,但也有些许乐趣的活,我一....

  Vivado调用Questa Sim或ModelSim仿真中存在的一些自动化问题的解决方案。 Viv....

  Hi 机友们,我想向你推荐一个小而美的产品,一个比Arduino更简单易用的开发套件——ShineB....

  Go 项目代码仓库昨日提交和合并的一个 PR 显示,Go 语言已在 cmd/compile 中默认启....

  许多Python标准库都有一些未被赏识的精华。其中之一是允许简单优雅的基于参数类型的函数分发。这一特....

  【导读】本文介绍了常用的加密算法,并对这些加密算法结合实际 golang 代码段进行了详细解读。 前....

  主机nginx 一般nginx做主机反向代理(网关)有以下配置 upstream order{ se....

  今天讲一个贪心的老司机的故事,就是力扣第 134 题「加油站」: 题目应该不难理解,就是每到达一个站....

  这道题目是非常经典的题目,也是比较简单的题目(至少一看就会)。 但正是因为这道题太简单,一看就会,一....

  Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....

  问题1:K8S集群服务访问失败?     原因分析:证书不能被识别,其原因为:自定义证书,过期等。 ....

  最近,想做点可视化的东西,打开Tableau,发现试用期又结束了,网上也流传了一些破解方法,但是尝试....

  ADI-blackfin-PPI驱动TFT屏的代码-TFT-Init(电源技术投稿模版)-ADI-b....

  C -与ORACLE直接连接代码(肇庆理士电源技术有限)-C#-与ORACLE直接连接代码,有需要的....

  本文介绍ADI SHARC DSP图形化开发,在一般我们都是使用vdsp++进行c语言开发的,但其实....

  软总线是什么?分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互....

  C语言是一种高级语言,在大多数情况下C语言的代码是和具体的处理器体系结构无关的。然而,在嵌入式系统的....

  本文的内容是最近我刚刚遇到的一个问题,问题代码是我自己写的,也是我自己写单元测试的时候发现的,也是我....

  ‍‍ 作者 Thomas Stringer 译者 弯月 出品 CSDN(ID:CSDNn....

  俗话说的好:工欲善其事,必先利其器。一款好的开发工具对程序员来说是至关重要的,可以降低开发成本、提高....

  【导读】:编译与链接对CC++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译与链接过程,陌生在于大....

  最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传....

  在许多实时应用中,如电机控制、发动机控制、无线通信等时间敏感的应用,CPU可能花费不到5%的时间执行....

  为了讲多路复用,当然还是要跟风,采用鞭尸的思路,先讲讲传统的网络 IO 的弊端,用拉踩的方式捧起多路....

  随着应用场合的增多,扫描设备不仅得到物体的三维坐标信息,也得到了物体的纹理信息。*.OBJ三维文件格....

  我们前文 我作了首诗,保你闭着眼睛也能写对二分查找 详细介绍了二分搜索的细节问题,探讨了「搜索一个元....

  MCU(微控制器)——今年的涨价王者! 无论是DIY还是专业产品,任何嵌入式电子设备的核心都是微控制....

  学习编程其实就是学高级语言,即那些为人类设计的计算机语言。 但是,计算机不理解高级语言,必须通过编译....

  P-TECH 全球挑战赛为参赛的所有青少年打开了未来的一扇窗,使他们有机会借助云计算和人工智能等前沿....

  发布人:Google Research 软件工程师 Michael Bendersky 和 Xuan....

  随着高速发展的数字化时代,越来越多的企业应用,对技术要求越来越高,软件实现越来越复杂,需要更快、更高....

  大多数情况下,如果你正在做的事情无法在互联网上找到答案,那么这通常意味着这个问题很难或者很重要,或者....

  本文大部分内容翻译总结自《Software Engineering at Google》 第10章节....

  题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....

  【导读】本文介绍了 DES 加密原理和作用,和 golang 中 DES 加密解密机制的相应实现。 ....

  【导读】什么是对称加密?Go 语言做对称加密怎么做?本文作者从加密原理到代码实现带你上车。 对称加密....

  应用中的几种常见类型的文件 ①Ability Ability 是应用所具备的能力的抽象,一个应用可以....

  Verilog HDL 优点:类似C语言,上手容易,灵活。大小写敏感。在写激励和建模方面有优势。 缺....

  程序员可能无意识的传递了错误参数;外界的强干扰可能将传递的参数修改掉,或者使用随机参数意外的调用函数....

  ICMP的英文全称为Internet Control Message Protocol,是Inter....

  Axivion静态代码分析工具已通过SGS-TÜV Saar的ISO 26262、IEC 61508....

  本声明由 Growth Capital Acquisition Corp. 及Cepton Tech....

未找到相应参数组,请于后台属性模板中添加
暂未实现,敬请期待
暂未实现,敬请期待
上一篇:结合STM32单片来讲讲结构体的运用 下一篇:2021年下半年计算机二级C语言模拟练习(7月9日)