阅读目录

  • 1.container_of宏
  • 2. 举例来说明container_of的使用
  • 1>正确示例:
  • 2>错误示例:

转自:http://blog.csdn.net/tigerjibo/article/details/8299589

版权声明:本文为博主原创文章,未经博主允许不得转载。

回到顶部

1.container_of宏

1> Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
2>接口:
container_of(ptr, type, member) 
 ptr:表示结构体中member的地址
 type:表示结构体类型
 member:表示结构体中的成员
通过ptr的地址可以返回结构体的首地址
3> container_of的实现: 
#define container_of(ptr, type, member) ({      \   
 const typeof( ((type *)0)->member ) *__mptr = (ptr);    \  
  (type *)( (char *)__mptr - offsetof(type,member) );})  
其实它的语法很简单,只是一些指针的灵活应用,它分两步:
第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member )获得)与ptr相同的指针变量__mptr,然后用它来保存ptr的值。
说明:typeof是GNU C对标准C的扩展,它的作用是根据变量获取变量的类型《typeof关键字在linux 内核中很常见》
第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。
关于offsetof的用法可参见offsetof宏的使用。

回到顶部

2. 举例来说明container_of的使用

回到顶部

1>正确示例:

#include <stdio.h>
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define  container_of(ptr, type, member) ({                      \const typeof( ((type *)0)->member ) *__mptr = (ptr);    \(type *)( (char *)__mptr - offsetof(type,member) );})
struct test_struct {int num;char ch;float f1;};int main(void){struct test_struct *test_struct;struct test_struct init_struct ={12,'a',12.3};char *ptr_ch = &init_struct.ch;test_struct = container_of(ptr_ch,struct test_struct,ch);printf("test_struct->num =%d\n",test_struct->num);printf("test_struct->ch =%c\n",test_struct->ch);printf("test_struct->ch =%f\n",test_struct->f1);return 0;}
执行结果:
jibo@jibo-VirtualBox:~/cv_work/work/list/container_of $ ./main
test_struct->num =12
test_struct->ch =a
test_struct->ch =12.300000

回到顶部

2>错误示例:

  #include <stdio.h> #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#define  container_of(ptr, type, member) ({                      \const typeof( ((type *)0)->member ) *__mptr = (ptr);    \(type *)( (char *)__mptr - offsetof(type,member) );}) struct test_struct {int num;char ch;float f1;}; int main(void){struct test_struct *test_struct;char real_ch = 'A';char *ptr_ch = &real_ch;test_struct = container_of(ptr_ch,struct test_struct,ch);printf("test_struct->num =%d\n",test_struct->num);printf("test_struct->ch =%c\n",test_struct->ch);printf("test_struct->ch =%f\n",test_struct->f1);return 0;}
执行结果为:
jibo@jibo-VirtualBox:~/cv_work/work/list/container_of1 $ ./main
test_struct->num =0
test_struct->ch =A
test_struct->ch =0.000000

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

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/7130862.html,如需转载请自行联系原作者

container_of分析--可用good【转】相关推荐

  1. container_of分析

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

  2. 【编译原理笔记18】代码优化:活跃变量分析,可用表达式分析

    本次笔记内容: 8-8 活跃变量分析 8-9 可用表达式分析 本节课幻灯片,见于我的 GitHub 仓库:第18讲 代码优化_3.pdf 文章目录 活跃变量分析 活跃变量 例:各基本块的出口处的活跃变 ...

  3. [DA45] 使用apriori分析导演选择演员倾向

    Apriori是常用的关联规则挖掘方法之一, 本例为关联规则挖掘实战练习, 通过python自动化爬虫抓取豆瓣电影中某导演的电影名和演员, 通过apriori算法看出来其选择演员的倾向. 一. 网络爬 ...

  4. [转]JFFS2源代码情景分析Beta2

    转载自:http://blog.csdn.net/flylonginsky/article/details/6321018 声明 你可以自由地随意修改本文档的任何文字内容及图表,但是如果你在自己的文档 ...

  5. PMP项目经理常用项目管理工具分析

    一.数据收集 1.头脑风暴:短时间内获得大量创意,需要引导者引导.用来产生和收集对项目与产品需求多种创意的技术,用于识别相关方的头脑风暴包括头脑风暴和头脑写作. 2.焦点小组:召集预定相关方和主题专家 ...

  6. NetBIOS网络基本输入/输出系统协议分析

    简介 NetBIOS(Network Basic Input/Output System)即网络基本输入/输出系统协议,英文原义:NetBIOS Services Protocols.是由IBM公司开 ...

  7. Linux次级代谢物分析,9大验证,精准靶向代谢组学技术对植物各部分次级代谢产物分析研究...

    前言 2020年2月24日加拿大研究者Jie chen在<Scientific Reports>发表的题为"Secondary Metabolites Profiled in C ...

  8. 学习分析技术文章笔记

    一.大数据给教育行业带来的重大影响 关键词:精确学情诊断 智能决策支持 大数据的突出作用: 1.有利于促进个性化学习:精细刻画.洞察需求,归纳分析学习风格和学习行为. 2.有利于实现差异化教学:一方面 ...

  9. IDC MarketScape《决策支持分析数据平台供应商评估》报告发布,亚马逊云科技位列“领导者”

    随着科学技术的不断发展,人们的生活方式也在不断改变.现在,人们可以通过互联网获得更多的信息,也可以通过智能手机随时随地与他人进行交流.此外,人工智能技术的进步也使得机器能够完成一些复杂的任务,从而提高 ...

最新文章

  1. try finally 中的return
  2. python输入input的用法
  3. Microbiome:NGLess语言实现快速可重复分析宏基因组的流程NG-meta-profiler
  4. idl结果显示窗口如何缩小_科学网—IDL 创建窗口 - 钱磊的博文
  5. python异步生成器
  6. 关于python的一些好的书籍推荐-荐书||关于Python的一些书籍推荐
  7. merge sort loser tree
  8. ARM、DSP、FPGA的区别
  9. 计算机能直接和cpu交换数据的是,内存储器_能直接与CPU交换信息的存储器是
  10. 国际电话区号 mysql数据表
  11. docker 中文文档
  12. php支付宝 缺少签名参数,【支付宝】退款接口 报 “缺少签名参数”
  13. 人工神经网络ANN(BP网络)
  14. 【网络安全】网络安全期末大题 复习题
  15. 超级马里奥(待完善)
  16. 品牌对比 | 蜜雪冰城 VS 喜茶
  17. Unity实现动态修改模型材质球
  18. 生命的轨迹会沿着期望的方向走去
  19. python cmap_Python cmap包_程序模块 - PyPI - Python中文网
  20. 小林coding 的笔记——图解网络(一)

热门文章

  1. 【.net深呼吸】动态类型(高级篇)
  2. 为什么说,长跑和爬山能锻炼意志?因为要不停的run,run,run......
  3. Python: translate()审查清理文本字符串
  4. js经典试题之ES6
  5. SSH,SCP,SFTP命令汇总
  6. Java NIO系列教程(九) ServerSocketChannel
  7. JS 取消冒泡事件 兼容火狐IE
  8. excel去掉超链接
  9. Mako 模板系统文档翻译(1) 使用基础
  10. mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)