list_head数据结构分析

1、list_head结构体的定义

struct list_head {
         struct list_head *next, *prev;
};
list_head结构包含两个指针成员,一个用于指向前一个节点,next用于指向下一个节点。


2、LIST_HEAD_INIT宏定义

#define LIST_HEAD_INIT(name) { &(name), &(name) }
该宏定义用于初始化结构变量name,让该结构的next,prev指针都指向自身,等同于代码如下:

struct list_head name ={ &(name), &(name) };


3、offsetof(TYPE, MEMBER)宏定义

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
该宏定义为计算结构体中成员MEMBER的地址偏移,(TYPE *)0为把0强制转换成TYPE类型的指针,即该TYPE类型成员的首地址为0,((TYPE*)0)->member为取该成员的偏移地址。


4、container_of(ptr, type, member)宏定义

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})
该宏定义的作用是通过结构体中某个成员的地址获得整个结构体的首地址,ptr为结构体中某个成员的实际地址,在实际应用中,ptr应该和member*的类型一致









猜你喜欢

转载自blog.csdn.net/xieshangjian/article/details/51589769
今日推荐