分类: LINUX
2011-09-12 11:17:05
前些天在一个同事那里聊到了零指针,突然又想起了这段代码,所以想拿出来再好好品一品。
这个宏定义就是想要根据结构体中某一个成员的地址来求出结构体的开始地址。
我们知道要求出结构体的开始地址,只需要知道其中一个成员的地址和这个成员与该结构体开始位置
的距离即可。
现在我们已经知道了其中一个成员的地址,那么只需要求出这个成员与该结构体的距离就可以了。
offsetof宏定义就是要求出这个值的。
1、首先来了解以下#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
给零指针强制转换成TYPE类型,那么我们现在就得到了一个指向TYPE类型的指针,值为0。
然后对其中的MEMBER取址(&((TYPE *)0)->MEMBER)其实就是MEMBER地址与TYPE开始地址的差了,我们
也就得到了这个成员与该结构体开始位置的距离。
2、#define container_of(ptr, type, member)
ptr是member的地址,我们利用typeof定义出一个member类型的指针__mptr,并让其指向member。
最后我们用__mptr减去通过offset得到的距离就是type结构体的开始地址了。