offsetof宏---个人笔记
2014-03-14 17:01
92 查看
标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量
offsetof(stu1,a): 0
offsetof(stu1,b): 4
offsetof(stu1,c): 8
sizeof(stu1) : 12
Press any key to continue
#include <stdio.h> //原型: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) /* #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 对这个宏的讲解我们大致可以分为以下4步进行讲解: 1、( (TYPE *)0 ) 0地址强制 "转换" 为 TYPE结构类型的指针; 2、((TYPE *)0)->MEMBER 访问TYPE结构中的MEMBER数据成员; 3、&( ( (TYPE *)0 )->MEMBER)取出TYPE结构中的数据成员MEMBER的地址; 4、(size_t)(&(((TYPE*)0)->MEMBER))结果转换为size_t类型。 宏offsetof的巧妙之处在于将0地址强制转换为 TYPE结构类型的指针, TYPE结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址。 可能有的读者会想是不是非要用0呢?当然不是,我们仅仅是为了计算的简便。 也可以使用是他的值,只是算出来的结果还要再减去该数值才是偏移地址。 */ typedef struct stu1{ int a; char b[1]; int c; }stu1; void main() { printf("offsetof(stu1,a):\t%d\n",offsetof(stu1,a)); printf("offsetof(stu1,b):\t%d\n",offsetof(stu1,b)); printf("offsetof(stu1,c):\t%d\n",offsetof(stu1,c)); printf("sizeof(stu1) :\t%d\n",sizeof(stu1)); }
offsetof(stu1,a): 0
offsetof(stu1,b): 4
offsetof(stu1,c): 8
sizeof(stu1) : 12
Press any key to continue
相关文章推荐
- 《算法导论》第6章 堆排序 个人笔记
- 【个人笔记】Mediaplayer使用感想
- C#调用存储过程实现分页(个人代码笔记)
- 产品经理做竞品分析的方法论(分享个人笔记)
- matlab个人笔记(二-下)
- 个人笔记
- java个人学习笔记:多态
- NP理论(4):判断如何成为算法 已有 951 次阅读 2016-9-21 17:22 |个人分类:NP理论|系统分类:科研笔记|关键词:判断 判定 Entscheidungsproblem 人机关
- Sybase个人学习笔记(摘录)
- [Java学习笔记] 对象的比较(引用比较、值比较) ^_^个人的理解,请多多关照^_^
- 产品经理20堂之第一课---个人笔记
- Android个人笔记 - Google Android揭秘_第一章
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记30 ScrollView Demo实战
- 个人学习笔记
- java基础(个人学习笔记,不断修改更新中)
- 为什么一定要整理博客或者技术笔记,个人的一些感想!
- 10、刘媛媛《普通人快速崛起31节修炼课》 第十讲 个人学习笔记
- 个人笔记------composer
- Service Mesh的一些开源项目,纯属个人笔记
- cURL 学习笔记与总结(3)模拟登录博客园并下载个人随笔首页