/* 已知一个结构体里面的成员的地址,反推出该结构体的首地址 */
#define rt_container_of(ptr, type, member) ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))
#define rt_list_entry(node, type, member) rt_container_of(node, type, member)
//node表示一个节点的地址,type表示该节点所在的结构体的类型,member表示该节点在该结构体中的成员名称。
在上图中,我们知道了一个节点tlist的地址ptr,现在要推算出该节点所在的type类型的结构体的起始地址f_struct_ptr。
我们可以将ptr的值减去图中灰色部分的偏移的大小就可以得到f_struct_ptr的地址,
**重点:**如何计算出灰色部分的偏移大小。
做法:
1、将0地址强制类型类型转换为type,即**(type*)0**,
2、然后通过指针访问结构体成员的方式获取到偏移的大小,即**(&((type*)0)->member),member表示该节点在该结构体中的成员名称。
3、最后即可算出f_struct_ptr ==== ptr - (&((type*)0)->member)**。