rt_list_entry (rt_container_of)宏定义:
![](https://i-blog.csdnimg.cn/direct/6a4969b197a744dc94a9cca054dfc75c.png)
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成员相对结构体首地址的偏移量。
![](https://i-blog.csdnimg.cn/direct/fbc2f932e1254a4aa6b6c039dbb2a620.png)
二、反推出当前结构体的 首地址 = ptr - &((type*)0)->member
![](https://i-blog.csdnimg.cn/direct/010c2b26ed10458798c898e4d976130f.png)