container_of 分析

1.container_of宏

1 > Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
2 > 接口:

container_of(ptr, type, member)

 ptr:表示结构体中member的地址
 type:表示结构体类型
 member:表示结构体中的成员

通过ptr的地址可以返回结构体的首地址

3 > container_of的实现:

其实它的语法很简单,只是一些指针的灵活应用,它分两步:

第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member )获得)与ptr相同的指针变量__mptr,然后用它来保存ptr的值。
说明:typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型《typeof关键字在linux 内核中很常见》

第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。
关于offsetof的用法可参见offsetof宏的使用。

2. 举例来说明 container_of 的使用

1 > 正确示例:

执行结果:

2 > 错误示例:

执行结果为:

注意,由于这里并没有使用一个具体的结构体变量,所以成员num和f1的值是不确定的。

1 1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部