#define list_entry(ptr, type, member) \
((type *) ((char *) (ptr) - (unsigned long) (&((type *) 0)->member)))
目的: 目的: // 根据节点ptr的地址,得到其type结构体的首地址, member是type结构体中的节点变量名
根据节点ptr, 找到ptr所在的type结构指针
ptr: list_t节点指针,
type: 要查找的指针类型
member: member是type结构体中定义的list_t类型变量名
分析:
(char *) (ptr)就是链表中的一个节点:&(t.member)
(unsigned long)&((type *) 0)->member): 是member成员到type结构首地址之间的距离
二者相减 = type变量的首地址
使用例子:
static LIST_HEAD (head);
typedef struct T {
int a;
list_t member;
}type
int main();
{
T t;
list_add(&t.member, &head);
}
ptr = head->next; // =&(t.member) 链表中的一个节点
struct T *p = list_entry(ptr, struct T, member) // = &t