首页 > 代码库 > 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)