Linux Kernel Version 4.14

1. container_of是干什么的?

  已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针

2 先看看container_of是如何定义的吧

#define container_of(ptr, type, member) \
(type *)((char *)(ptr) - (char *) &((type *))->member)

  解析一下各参数:

  ptr: 结构体成员的指针

  type: 结构体的类型

  member: 结构体成员的名字

2. 举一个例子

  2.1 有两个结构体如下:

    struct element1 {

      struct element2 struct_element2;

      int element3;

    }

    struct element2 {

      int element4;

    }

  2.2 定义一个struct element1变量element

    struct element1 element

  2.3 已知结构体变量element中成员element3的地址为0x2d,通过结构体struct element1中的成员element3来获取结构体变量element的地址

    container_of(element3_ptr,struct element1,element3)

  2.4 拆开

    (struct element1 *)((char *)(&element3) - (char *) &((struct element1 *)0)->element3)

    从已知可得:

    &element3=0x2d;

    (char *)(&element3)=0x2d;

    (struct element1 *)0=地址为0x0,指向的内容为一个struct element1结构体;

    ((struct element1 *)0)->element3=结构体中element3的内容;

    &((struct element1 *)0)->element3=取结构体中element3的地址,这是偏移地址,为0x04;

    (char *)&((struct element1 *)0)->element3=0x04;

    最终:

    ((char *)(&element3) - (char *) &((struct element1 *)0)->element3)=0x2d - 0x04) = 0x29

    (struct element1 *)0x29 = 0x29,0x29这个地址指向的是一个结构体struct element1,那么这就是element变量的地址

    

    可以结合下图观看:

  

    

    

最新文章

  1. IIS发布问题汇总
  2. 【Swift学习】Swift编程之旅---ARC(二十)
  3. underscore 笔记
  4. 高度30px,宽度自适应,点线在文字中间
  5. PHP MYSQLI中事务处理
  6. JAVA之装饰者模式
  7. 如何使用CSS Sprites技术进行图片合并
  8. ScriptManager需要用到的JS
  9. Swift - 炫酷放射弹出按钮菜单(改造自AwesomeMenu)
  10. 警惕Dictionary和SortedDictionary的顺序陷阱
  11. Golang版protobuf编译
  12. C++ 最简单的日志类
  13. Linux安装Tomcat8
  14. python 通用装饰器,带有参数的装饰器,
  15. mysql操作命令梳理(5)-执行sql语句查询即mysql状态说明
  16. 攻击者利用的Windows命令、横向渗透工具分析结果列表
  17. Coredata 单表简单使用
  18. bzoj千题计划249:bzoj5100: [POI2018]Plan metra
  19. Js数组里剔除指定的元素(不是指定的位置)
  20. 如何减少block的嵌套层次?

热门文章

  1. jar包的读取
  2. C# 如何批量修改集合元素的属性值?
  3. idea上更新文件到github上
  4. GDTR与LDTR
  5. ASP.NET MVC Action返回结果类型【转】
  6. C#深入研究ArrayList动态数组自动扩容原理
  7. 20155228 2016-2017-2 《Java程序设计》第6周学习总结
  8. .net 学习笔记2
  9. 韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING
  10. 多线程(threading)示例