container_of是linux内核数据结构中经常用到的宏,看了好多帖子终于明白了,其实简单的不行!^_^
这个宏定义在include/linux/kernel.h里面了
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
这个宏是做什么的? 他可以根据结构体的成员变量获取所在结构体的首地址。
话说有个结构体a, 地址表示为 &a, 这个结构体里面有个成员叫b
地址表示为 &b, 现在请问 “ &b - &a ” 表示什么含义?
答案:偏移量,成员变量的首地址相对于结构体首地址的偏移量。
如果 &a 碰巧又等于0 ,那么 &b - &a = &b - 0 = &b
这样话,上面的答案就变成了:成员变量的首地址,就是偏移量
这个说的就是 offsetof的作用
现在我们有了偏移量,再拿到成员变量的实际地址,减去上面说的偏移量,不就是当前结构体的首地址了吗!?