从offsetof说起
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
上面是type结构体中,member在type中的偏移量,其中的关键就是对于数字0的强转,
把数字0强转成(type *)的结构体指针,那么这个指针的值,注意是指针的值就是0
比如int a =3;
int *p = (int *)a;
则P=3,即p的内容是3.
P指向空间的地址是3.
所以取(0->member)的地址就是相对0的便宜,就是偏移量
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \ ------申明一个member类型的指针,赋值为ptr
(type *)((char *)__mptr - offsetof(type, member)); }) -------将ptr的值减去便宜量即为原结构体首地址,将值在转换为结构体类型的指针,即为结构体的首地址。
阅读(1416) | 评论(0) | 转发(0) |