container_of宏之前看了一下内核里面的使用方法,然后就直接依葫芦画瓢用了。没有深究其实现原理。最近使用list_head的时候,发现也用到了container_of。所以就详细看看container_of的实现原理。然后总结一下。
先看如下代码:
#include <stdio.h>
struct test
{
int a;
int b;
int c;
};
int main(void)
{
struct test t;
printf("t:%p\n", &t);
printf("a:%p\n", &t.a);
printf("b:%p\n", &t.b);
printf("c:%p\n", &t.c);
}
#if 0
编译本代码后,执行输出如下结果:
t:0x7fff3ee19090
a:0x7fff3ee19090
b:0x7fff3ee19094
c:0x7fff3ee19098
#endif
结合上面的代码,问个问题A,如果我们知道t.c的地址,怎么计算t的地址。
计算方式如下:t=t.c-8
那么问题又来了,我们根据结果或者结构体的定义,可以知道这个8是怎么来的。但是我们只知道t.c的地址,和t的类型,怎么来得到这个8呢?
内核的人牛逼的点来:
(struct test *)0
1、将0地址强行转换成struct test类型。
struct test *p=(struct test *)0;
2、我们有了p指针