对list_entry(ptr, type, member)的理解
2013-10-23 15:19
225 查看
如何根据一个结构体成员的地址、结构体类型以及该结构体成员名获得该结构体的首地址?
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
其中,ptr为指向该结构体成员的指针,type为该结构的类型,member为该结构成员的名称。
理解:
&((type *)0)->member的目的是为了获得上图中问号表示的范围的大小。这段代码等价于:
type * p = (type *)0; //便于获得某个结构体成员相对于该结构体起始地址的偏移量
&(p->member); //获得从member结构体成员相对于该结构体首地址的偏移量
还需要注意的是必须将ptr强转为char *类型,这样每次移动一个字节。
(char *)(ptr)-(unsigned long)(&((type *)0)->member) 即为该结构体的首地址,然后将其强转为指向该结构体的指针。
#define list_entry(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
其中,ptr为指向该结构体成员的指针,type为该结构的类型,member为该结构成员的名称。
理解:
&((type *)0)->member的目的是为了获得上图中问号表示的范围的大小。这段代码等价于:
type * p = (type *)0; //便于获得某个结构体成员相对于该结构体起始地址的偏移量
&(p->member); //获得从member结构体成员相对于该结构体首地址的偏移量
还需要注意的是必须将ptr强转为char *类型,这样每次移动一个字节。
(char *)(ptr)-(unsigned long)(&((type *)0)->member) 即为该结构体的首地址,然后将其强转为指向该结构体的指针。
相关文章推荐
- list_entry(ptr, type, member)——知道结构体内某一成员变量地址,求结构体地址
- #define list_entry(ptr, type, member)
- list_entry(ptr, type, member)
- #define list_entry(ptr, type, member) \ container_of(ptr, type, member)
- Linux内核中的常用宏--container_of(container_of(ptr, type, member)
- container_of(ptr, type, member)
- 终于理解list_entry和list_for_each_entry
- 内核container_of(ptr,type,member) 解析
- linux container_of(ptr, type, member)
- 浅析container_of(ptr, type, member)
- linux中container_of(ptr, type, member)
- container_of(ptr, type, member)及链表操作
- container_of(ptr, type, member)宏定义解析
- (转载)浅析linux 内核代码中的container_of(ptr, type, member)宏
- list_for_each & list_entry & 对内核链表的理解
- linux中container_of(ptr, type, member)的使用
- linux核list_for_each_entry(pos, head, member)分析
- 对container_of(ptr,type,member)分析
- 深入理解Linux内核list_entry()宏
- (转)内核container_of(ptr,type,member) 解析