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

rt_list_entry (rt_container_of)宏定义:

cpp 复制代码
/**
 * 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

相关推荐
无聊的小坏坏1 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
长路 ㅤ   1 小时前
Java后端技术博客汇总文档
分布式·算法·技术分享·编程学习·java后端
秋说1 小时前
【PTA数据结构 | C语言版】两枚硬币
c语言·数据结构·算法
qq_513970442 小时前
力扣 hot100 Day37
算法·leetcode
不見星空2 小时前
leetcode 每日一题 1865. 找出和为指定值的下标对
算法·leetcode
我爱Jack2 小时前
时间与空间复杂度详解:算法效率的度量衡
java·开发语言·算法
DoraBigHead4 小时前
小哆啦解题记——映射的背叛
算法
Heartoxx4 小时前
c语言-指针与一维数组
c语言·开发语言·算法
孤狼warrior4 小时前
灰色预测模型
人工智能·python·算法·数学建模
京东云开发者4 小时前
京东零售基于国产芯片的AI引擎技术
算法