在 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

相关推荐
Coovally AI模型快速验证7 分钟前
Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式
深度学习·算法·目标检测·计算机视觉·cnn·开源·transformer
算法工程师y13 分钟前
Matlab图像处理基础入门 - 亮度/对比度调整实战
图像处理·人工智能·算法·matlab
芥子沫13 分钟前
Java常见排序算法及代码实现
java·算法·排序算法
apcipot_rain15 分钟前
数据结构实验——排序算法的实现与分析
c语言·数据结构·算法·排序算法
九天之凤18 分钟前
场景速记排序算法
算法·排序算法·速记
得物技术27 分钟前
得物端智能视频封面推荐
前端·算法
萌の鱼28 分钟前
leetcode 2684. 矩阵中移动的最大次数
数据结构·c++·算法·leetcode·矩阵
m0_5195231044 分钟前
算法练习——哈希表
数据结构·c++·算法
快手技术1 小时前
可灵视频生成可控性为什么这么好?快手又公开了四篇研究
人工智能·算法·机器学习
a_j581 小时前
算法与数据结构(合并两个有序数组)
数据结构·算法·leetcode