欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

2025/2/24 12:07:39 来源:https://blog.csdn.net/m0_46170433/article/details/145590812  浏览:    关键词:在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义:

/*** 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 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词