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

嵌入式学习笔记 - 关于结构体成员地址对齐问题

一  在没有#pragma pack()这个宏声明的情况下

C语言中结构体成员分配内存大小时需要满足2个条件,这也是内存对齐的原则

①每个成员变量的起始地址必须为其数据类型所占空间大小的整数倍

②结构体所占空间总大小为其最大数据类型成员变量大小的整数倍

例如:

其地址分配如下图,因为b的大小位4字节,所以起始地址必须另起一行,放在起始为0,4,8,C起始地址的内存地址,又因为结构体总大小为最大成员变量的整数倍,所以此结构体大小为4*3=12byte。

再例如:

其地址分配如下图,因为c的大小位2字节,所以起始地址可以放在起始为0,2,4,8起始地址的内存地址,又因为结构体总大小为最大成员变量的整数倍,所以此结构体大小为4*2=8byte。

二 在有#pragma pack()这个宏声明的情况下,规则要改一下:

是按照这个宏声明的和实际数据类型中最大值较小的那个来决定

例如:当宏声明比实际数据类型中最大值小时:

因为加了#pragma pack(1),按照如下图分配地址,结果为5

当宏声明#pragma pack(8)比实际数据类型中最大值(这里为4)大时,还是按照实际数据类型进行分配地址:

如下图,结果为12

http://www.xdnf.cn/news/365833.html

相关文章:

  • Edu教育邮箱申请成功下号
  • Knife4j文档的会被全局异常处理器拦截的问题解决
  • Python MNE-Python 脑功能磁共振数据分析
  • IO-Link系列集线器(三格电子)
  • MySQL 安全架构:从渗透测试到合规审计
  • 对称加密以及非对称加密
  • 从零理解 RAG:检索增强生成的原理与优势
  • Linux系统Shell脚本之sed
  • 深度学习-161-Dify工具之对比使用工作流和聊天流生成图表可视化的html文件
  • css样式实现-新闻列表
  • MySQL相关查询
  • 在 MyBatis 中实现控制台输出 SQL 参数
  • htmlUnit和Selenium的区别以及使用BrowserMobProxy捕获网络请求
  • RoPE长度外推:外插内插
  • ResNet详解
  • 企业名录搜索软件靠谱吗 企业名录搜索软件怎么使用
  • LSTM的简单模型
  • git做commit信息时的校验
  • C++ —— 可变参数
  • D720201 PCIE 转USB HUB
  • 值拷贝、浅拷贝和深拷贝
  • 利用混合磁共振成像 - 显微镜纤维束成像技术描绘结构连接组|文献速递-深度学习医疗AI最新文献
  • DAY04:Vue.js 指令与事件处理深度解析之从基础到实战
  • 弹窗表单的使用,基于element-ui二次封装
  • 十三、基于大模型的在线搜索平台——整合function calling流程
  • 萤石无插件取流巡检组件,便捷支持多屏预览与回放
  • MCP(Model Context Protocol,模型上下文协议)
  • tcpdump 的用法
  • [sklearn] 特征工程
  • LeRobot 项目部署运行逻辑(五)——intelrealsense.py/configs.py