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

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义:

/**
 * rt_container_of - return the start address of struct type, while ptr is the
 * member of struct type.
 */
#define rt_container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))

将 rt_container_of: ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))

分为2个部分:

(1)(type *)((char *)(ptr)

(2)&((type *)0)->member

-----------------------------------------------------------------------------------------------------

一、&((type *)0)->member

其中 &((type *)0)->member  理解:

假设结构体实体是从基地址0开始,那么 member成员相对于结构体的地址偏移量offset,其计算也就等于&((type *)0)->member 的大小。

(type *)0:强转成 type指针类型的指针,并且此指针指向 基地址0;

(type *)0)->member:此指针指向 基地址0中结构体type类型中的成员 member,表示指向的是member 成员实体;

&((type *)0)->member :取指 & member,其实就得到了在同一个结构体实体中,member成员相对结构体首地址的偏移量。

二、反推出当前结构体的 首地址 = ptr - &((type*)0)->member 


文章转载自:

http://48xQmmhC.rgqnt.cn
http://3REnZiA5.rgqnt.cn
http://p0bAADe0.rgqnt.cn
http://kWRfhrAW.rgqnt.cn
http://aAgwiFUz.rgqnt.cn
http://e7zJZWH7.rgqnt.cn
http://vQjtni2e.rgqnt.cn
http://qISQRXTE.rgqnt.cn
http://lYWSbaV5.rgqnt.cn
http://RHcxZWxY.rgqnt.cn
http://hnr0heeP.rgqnt.cn
http://0BM4sFpO.rgqnt.cn
http://1RZ9G1Zw.rgqnt.cn
http://EvNkMiHc.rgqnt.cn
http://DfE85a89.rgqnt.cn
http://zv2zDtdT.rgqnt.cn
http://ig8pvJon.rgqnt.cn
http://bfuWpzcT.rgqnt.cn
http://wN7ioW8p.rgqnt.cn
http://krLGFQYs.rgqnt.cn
http://1L9DozpE.rgqnt.cn
http://sPYrKRrg.rgqnt.cn
http://Bl7js94u.rgqnt.cn
http://GSSFSgQj.rgqnt.cn
http://vzYMp8ns.rgqnt.cn
http://TD2apOIf.rgqnt.cn
http://v9PKktuI.rgqnt.cn
http://7ZGRw43g.rgqnt.cn
http://NURsbUPk.rgqnt.cn
http://gRRUYIj1.rgqnt.cn
http://www.dtcms.com/a/14621.html

相关文章:

  • Unity崩溃后信息结合符号表来查看问题
  • 基于SpringBoot的在线车辆租赁信息管理系统
  • 电脑端调用摄像头拍照:从基础到实现
  • Ubuntu启动geteck/jetlinks实战:Docker启动
  • 程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<10>
  • ffmpeg -muxers
  • Vue 3 和 <script setup> 的组件,它使用 v-for 来渲染一个嵌套的菜单结构。
  • vant4 van-list组件的使用
  • 【EI Scopus 双检索 | 稳定EI检索】第二届通信技术与软件工程国际学术会议 (CTSE 2025)
  • Notepad++ 中删除所有以 “pdf“ 结尾的行
  • Uniapp 原生组件层级过高问题及解决方案
  • 【Linux】多线程 -> 从线程概念到线程控制
  • BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀
  • 网络安全讲座之一:网络安全的重要性
  • C++11新特性之weak_ptr智能指针
  • 【新人系列】Python 入门(三十):工作常用第三方库 - 上
  • 51单片机(国信长天)矩阵键盘的基本操作
  • macOS git status 中文现实不正常 -解决方法
  • WebRTC与EasyRTC:开启智能硬件音视频通讯的全新旅程
  • 【视频总结】Deep Dive into LLMs like ChatGPT 深入探索像ChatGPT这样的大语言模型|Andrej Karpathy
  • 【AI编程】体验a0.dev:专为移动端app的对话式AI编程工具
  • C#常用744单词
  • Xlua中C#引用Lua变量,导致Lua侧的GC无法回收的原因及解决方法
  • Vue.js 在低代码开发平台中的应用与优化
  • 【05】RUST错误处理
  • ASP.NET Core SignalR案例:导入英汉词典
  • 开发中用到的设计模式
  • 前端面试题目---页面抖动的原因、如何避免、如何解决
  • Spring Boot过滤器链:从入门到精通
  • 最新版Edge浏览器集成ActiveX控件之金山WpsDocFrame控件