offsetof宏---个人笔记

  标准库里面提供的offsetof(t,m)宏,用来计算两个变量在内存中的地址偏移量

#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

posted on 2014-03-14 17:01  程良  阅读(332)  评论(0编辑  收藏  举报

导航