container_of的实现 - HeavyYuan/A-CD-Record-Management-System GitHub Wiki

container_of的实现:

container_of用于在知道结构体内部元素的情况下,求得结构体本身的地址。
已知:
1)结构体的类型
2)成员member的变量名
3)成员member的指针

求解:
结构体地址

tricks: 地址0的运用和类型强制转换

具体实现:
#define offsetof(type, member) (size_t)&(((type *)0)→member)

#define container_of(ptr, type, member) ({\
const (typeof((type *)0→member))_mptr = ptr; \ 对ptr做类型检查
(type *)((char *)_mptr – offsetof(ptr,member));} ) 指针运算,注意是char *类型地址减去偏移数值

offsetoff是:type类型的的结构体中,元素member的偏移位置
结构体一般用其首个元素来引用,这里巧妙用到了0地址,将其强制类型转换成type指针,
然后得到它的member成员的地址,再将其强制转换成size_t类型(具体数值)

container_of原理图

⚠️ **GitHub.com Fallback** ⚠️