Linux内核分析

今天遇到了一个函数,是Linux内核中的一个函数

list_entry(ptr,type,member); //意义为从一个结构的成员指针'ptr'找到其容器'type'的指针。

list_entry的宏定义:
#define list_entry(ptr, type, member) \ 
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 

 (type *)0是为了计算地址方便。意思是在0这个地址看做有一个虚拟的type类型的变量,那么取一个成员再取这个成员的地址,就是这个结构体 中这个成员的绝对地址,由于结构体在地址为0的地方,所以这个成员'member'在这个结构体中的相对位置也是这个值了。   然后再用这个'member'的绝对地址也就是参数'ptr'减去它的相对位置就得出了'member'所在结构也就是参数'type'的真正绝对地址。






原文地址:https://www.cnblogs.com/bugY/p/2219893.html