container_of函数的作用
(1)、作用:通过ptr(结构体某个成员的实际地址)计算的到相结构体的实际首地址(进而可以得到整个结构体)。
(2)函数原型:
#define container_of(ptr,type,member) ({
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
函数解析:
第二行的主要作用是用作校验ptr的类型就是type,如果ptr的类型不是type的话编译就会有警告。
第三行的主要思想是:用已知结构体成员的实际地址减去他相对于结构体首地址的偏移量。其中的难点在于计算偏移量,其中sffsetof就是用来计算偏移量的。
sffsetof的原型是 #define offsetof(TYPE, MEMBER) &((TYPE *)0)->MEMBER
解析:由于定义0指针结构体他的首地址是0所以可以很容易得到成员相对于0地址的偏移量。这个偏移量也就上面所说的偏移量了。
(3)、实例列举
struct test
{
int a;
int b;
}
struct test *temp;
int c=temp->b;
temp = container_of(&temp->b,struct test,b);