(转)内核container_of(ptr,type,member) 解析
- struct student a {
- char *name;
- int age;
- }
- int *page = &age;
- 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) 即为所求的指针
根据我们的思路看内核里面的实现, 果然跟我们所想的一样
- kernel.h
- #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)
转自: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
最新文章
- CSS3使用Font Awesome字体图标的控件样例(按钮,工具栏,输入框)
- jsp实现一条横线中间有字的样式
- getRow()方法
- js获取网页的各种高度和宽度
- (Android)View.getHeight或getWidth为0时的一些解决方案
- Android 自定义对话框使用静态Handler传递参数
- java web工程发布以及解决tomcat闪退
- BGP
- js控制浏览器后退
- DevExpress XtraReports 入门四 创建 Web 报表
- 使用线程执行堆栈StackTraceElement设计Android日志模块
- [ERROR] InnoDB: Cannot allocate memory for the buffer pool
- (HTTPS)-强制 SSL (HTTPS)Filter
- Day4 装饰器——迭代器——生成器
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
- pycharm配置运行django项目步骤
- js switch 用法
- hadoop题目(一)
- Noisy Channel模型纠正单词拼写错误
- winrar压缩过滤文件及文件夹
热门文章
- AsyncTask doinbackground onProgressUpdate onCancelled onPostExecute的基本使用
- taro 打包微信小程序运行失败(二)
- 移动端项目中 @2x 图 和 @3x 图 的使用
- [Exception JavaWeb 1] - javax.el.PropertyNotFoundException: Property 'id' not found on ..........
- Sublime Text 包管理工具及扩展大全
- 公用的css
- ASP.Net中后台控制页面提示信息的显示方式
- 数据库字符集与排序规则(Character Set And Collation)
- centos下node.js的安装
- Android EditText 赋值与取值