在 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

相关推荐
澈20721 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
ambition2024221 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_21 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi21 小时前
前缀和差分
算法·图论
代码旅人ing1 天前
链表算法刷题指南
数据结构·算法·链表
Yungoal1 天前
常见 时间复杂度计算
c++·算法
不爱吃炸鸡柳1 天前
单链表专题(完整代码版)
数据结构·算法·链表
CylMK1 天前
题解:AT_abc382_d [ABC382D] Keep Distance
算法
Dfreedom.1 天前
计算机视觉全景图
人工智能·算法·计算机视觉·图像算法
Morwit1 天前
【力扣hot100】 1. 两数之和
数据结构·c++·算法·leetcode·职场和发展