日期:2014-05-16 浏览次数:20814 次
作者:阿波
链接:http://blog.csdn.net/livelylittlefish/article/details/20565261
(几年前的一篇文章,翻出来共享一下。)
Content
0. 引子
1. 举例
(1) 代码
(2) 检查结果
(3) 为什么从0开始?
(4) 从非0地址开始的结果
2. 小结
0. 引子
在linux-2.26.23版的内核代码中,./include/linux/stddef.h文件中有如下定义。
00020: #undef offsetof 00021: #ifdef compiler_offsetof 00022: #define offsetof(TYPE,MEMBER) compiler_offsetof(TYPE,MEMBER) 00023: #else 00024: #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 00025: #endif 00026: #endif /* KERNEL */ 00027: 00028: #endif
compiler_offsetof不是笔者关心的内容,第二个宏定义即为本文讨论的方法。
这个宏定义很好解释: