1、在内核中的原型:
#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \
(type *)((char *)__mptr - offsetof(type, member)); })
#endif
#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)
2、参数:
ptr:指向实例化的结构体元素member的指针
type:是这个结构体类型
member:结构体中一个元素的元素名
3、源码分析:0地址是不能访问进行读写的,这里只是用0地址做一个类型转化,没有读写
(1) ((type *)0)->member 将0地址定义成一个type类型指针,这个指针就可以访问这个类型里面的任意元素了
(2) typeof(((type *)0)->member) 得到这个元素的数据类型
(3) const typeof(((type *)0)->member) * __mptr = (ptr) 把内存中被实例化的结构体变量里面member元素的指针用新定义的__mptr存下来,