函数宏 container_of(ptr,type,member) 原理其实很简单 已知结构体type的成员member的地址ptr,求解结构体type的起始地址
ptr:代表结构体成员的真实地址
type:结构体的类型
member:结构体成员的名字
#define container_of(ptr, type, member) ({
const typeof(((type *)0)->member) * __mptr = (ptr);
(type *)((char *)__mptr - offsetof(type, member)); })
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
先把0地址转换为一个指向type结构体类型的指针,然后将其指向member成员
然后对其取地址 因为这个地址是相对于0地址的,所以本身值就代表成员的偏移量,size_t是对地址进行的强转
typeof是获得()里面的类型
type结构体起始地址=ptr-size size是起始地址到member的大小
const typeof(((type *)0)->member) * __mptr = (ptr)
取得ptr在内存中实际的地址
(type *)((char *)__mptr - offsetof(type, member));
最后直接用成员地址减去成员偏移地址
container_of函数宏计算结构体地址
最新推荐文章于 2021-05-14 07:03:03 发布