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

在 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://www.kler.cn/a/546826.html

相关文章:

  • Android WindowContainer窗口结构
  • DeepSeek官方发布R1模型推荐设置
  • 51单片机-C语言扩展及最小系统
  • java面试题(一年工作经验)的心得
  • 【NLP】循环神经网络RNN
  • 动态规划LeetCode-494.目标和
  • wps或office的word接入豆包API(VBA版本)
  • Django中实现简单易用的分页工具
  • PyTorch Lightning pytorch.loggers模块介绍
  • Linux 常见的虚拟文件系统
  • 数据结构(陈越,何钦铭)第三讲 树(上)
  • 《Keras 3 :当 Recurrence 遇到 Transformers 时》
  • 配置 Nginx 以支持 HTTPS
  • 二叉树链式结构:数据结构中的灵动之舞
  • 20250214 随笔 线程安全 线程不安全
  • C++实用技巧之 --- 观察者模式详解
  • OpenEuler学习笔记(三十三):在 OpenEuler 上搭建 OpenGauss 数据库环境
  • Swift 的 KeyPath 是什么?
  • Java网络编程学习(二)
  • 西门子S7-1500 PLC的自动化控制系统解决方案