已知一个结构体里面的成员的地址,反推出该结构体的首地址的宏

/* 已知一个结构体里面的成员的地址,反推出该结构体的首地址 */
#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)**。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值