首页 > 代码库 > list_entry()
list_entry()
macro :
#define list_entry(ptr,type,member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
功能 从一个结构的成员指针找到其容器的指针
原理: ptr是指向type结构体member成员的指针
&((type *)0)->member
把0强制转化为指针类型,即0是一个地址,为段基址。取以0为结构体基址的结构体的域变量member的地址,那么这个地址就等于member域到结构体基地址的偏移字节数。
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
ptr是指向类型为type的某结构体中的成员member的指针,减去该member在结构体中的偏移量,即得到该结构体的起始地址。
list.h中定义了下面三个宏
#define list_entry(ptr, type, member) container_of(ptr, type, member)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)