结构体成员指针反推该结构体变量的指针(内核链表里从小结构体指针找到大结构体指针)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfeng0328/article/details/86776092

计算结构体中某个元素相对结构体首字节地址的偏移量 基础上进行 结构体成员指针反推该结构体变量的指针

计算结构体中某个元素相对结构体首字节地址的偏移量:https://blog.csdn.net/fengfeng0328/article/details/86775905

#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)

在上面基础上引入 container_of 宏:

#define container_of(ptr, type, member) ({
    const typeof(((type *)0)->member) *__mptr = (ptr);
        (type *)((char *)__mptr - offsetof(type,member));})

使用方法:prt是指向结构体元素 member 的指针,type 是结构体类型,member 是结构体中一个元素名,这个宏返回的就是指向这个结构体变量的指针,类型是 (type *) 。

作用:知道一个结构体变量中某个成员的指针,反推这个结构体变量的指针。有了 container_of 宏,我们可以从一个成员的指针得到整个结构体变量的指针,继而得到结构体中其他成员的指针。

原理:先用 typeof 得到 member 成员的类型,将 member 成员的指针转成自己类型的指针,然后用这个指针减去该成员相对于整个结构体变量的偏移量(偏移量用offsetof宏得到),之后得到的就是整个结构体变量的首地址了,再把这个地址强制类型转换为 type *即可。
 

通过 container_of 宏就可以从一个结构体成员指针反推该结构体变量的指针

猜你喜欢

转载自blog.csdn.net/fengfeng0328/article/details/86776092