container_of(ptr,type,member) 用于在已知结构体里面成员member和该成员指针ptr(就是地址)和结构体类型type, 返回该成员所在的结构体的指针(就是地址), 例如已知
  1. struct student a {
  2. char *name;
  3. int age;
  4. }
  5. int *page = &age;
  6. container_of(page, struct student, a.age); 返回a的地址

实现该方法可以分三步:
0 算出a.age在a里面的偏移,可以通过将零地址强制转换成struct student格式, (struct student *)0, 那么  ((struct student *)0)->age 即是偏移大小
1 已知a.age地址和在a里面的偏移,即可通过a.age 地址减去偏移得到a的地址, (char *) page - ((struct student *)0)->age
2 最后将得到的地址强制 转换成struct student 格式, (struct student *)((char *)page - ((struct student *)0)->age) 即为所求的指针
根据我们的思路看内核里面的实现, 果然跟我们所想的一样

  1. kernel.h
  2. #define container_of(ptr, type, member) ({            \
  3. const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
  4. (type *)( (char *)__mptr - offsetof(type,member) );})
  5. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

转自:http://blog.csdn.net/hellowxwworld/article/details/11072683

该宏定义在kernel.h中;

原型为#define container_of(ptr, type, member) ({\
    const typeof( ((type *)0)->member ) *__mptr = (ptr);\
    (type *)( (char *)__mptr - offsetof(type,member) );})
 其中 ptr是指向正被使用的某类型变量指针;type是包含ptr指向的变量类型的结构类型;member是type结构体中的成员,类型与ptr指向的变量类型一样。
功能是计算返回包含ptr指向的变量所在的type类型结构变量的指针。(比较拗口)
该宏的实现思路:计算type结构体成员member在结构体中的偏移量,然后ptr的地址减去这个偏移量,就得出type结构变量的首地址。
该宏的实现方法:1、通过typeof关键字定义一个与type结构体的member成员相同的类型的变量
__mptr且将ptr值赋给它。
             2、用宏offsetof(type,member),获取member成员在type结构中的偏移量
(原型:offsetof(TYPE,MEMBER) ((size_t)&(TYPE *)0)->MEMBER). 定义在stddef.h.)
             3、最后将__mptr值减去这个偏移量,就得到这个结构变量的地址了(亦指针)。

typeof是个关键字,可用来引用宏参数的类型。

转自:http://blog.chinaunix.net/uid-24467128-id-2606205.html

最新文章

  1. CSS3使用Font Awesome字体图标的控件样例(按钮,工具栏,输入框)
  2. jsp实现一条横线中间有字的样式
  3. getRow()方法
  4. js获取网页的各种高度和宽度
  5. (Android)View.getHeight或getWidth为0时的一些解决方案
  6. Android 自定义对话框使用静态Handler传递参数
  7. java web工程发布以及解决tomcat闪退
  8. BGP
  9. js控制浏览器后退
  10. DevExpress XtraReports 入门四 创建 Web 报表
  11. 使用线程执行堆栈StackTraceElement设计Android日志模块
  12. [ERROR] InnoDB: Cannot allocate memory for the buffer pool
  13. (HTTPS)-强制 SSL (HTTPS)Filter
  14. Day4 装饰器——迭代器——生成器
  15. C语言中如何写一个简单可移植而又足够随机的随机数生成器
  16. pycharm配置运行django项目步骤
  17. js switch 用法
  18. hadoop题目(一)
  19. Noisy Channel模型纠正单词拼写错误
  20. winrar压缩过滤文件及文件夹

热门文章

  1. AsyncTask doinbackground onProgressUpdate onCancelled onPostExecute的基本使用
  2. taro 打包微信小程序运行失败(二)
  3. 移动端项目中 @2x 图 和 @3x 图 的使用
  4. [Exception JavaWeb 1] - javax.el.PropertyNotFoundException: Property 'id' not found on ..........
  5. Sublime Text 包管理工具及扩展大全
  6. 公用的css
  7. ASP.Net中后台控制页面提示信息的显示方式
  8. 数据库字符集与排序规则(Character Set And Collation)
  9. centos下node.js的安装
  10. Android EditText 赋值与取值