你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux内核开发:offset宏的讲解

[日期:2013-01-17] 来源:Linux社区  作者:tigerjb [字体: ]

1.offset宏讲解
#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呢?当然不是,我们仅仅是为了计算的简便。也可以使用是他的值,只是算出来的结果还要再减去该数值才是偏移地址。来看看如下的代码:

  #include<stdio.h>

  #defineoffsetof(TYPE, MEMBER) ((size_t) &((TYPE *)4)->MEMBER)

  struct test_struct {

          int num;

          char ch;

          float f1;

  };

 int main(void)

  {

    printf("offsetof (struct test_struct,num)=%d\n",offsetof(struct test_struct,num)-4);

    printf("offsetof (structtest_struct,ch) =%d\n",offsetof(struct test_struct,ch)-4);

    printf("offsetof (struct test_struct,f1)=%d\n",offsetof(struct test_struct,f1)-4);

          return 0;

  }

运行结果为:

jibo@jibo-VirtualBox:~/cv_work/work/list/offset $ ./main

offsetof (struct test_struct,num) =0

offsetof (struct test_struct,ch) =4

offsetof (struct test_struct,f1) =8

为了让大家加深印象,我们在代码中没有使用0,而是使用的4,所以在最终计算出的结果部分减去了一个4才是偏移地址,当然实际使用中我们都是用的是0。

二.举例体会offsetof宏的使用:
  #include<stdio.h>

  #defineoffsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

  struct test_struct {

          int num;

          char ch;

          float f1;

  };

 int main(void)

  {

      printf("offsetof(struct test_struct,num) =%d\n",offsetof(struct test_struct,num));

    printf("offsetof (structtest_struct,ch) =%d\n",offsetof(struct test_struct,ch));

    printf("offsetof (struct test_struct,f1)=%d\n",offsetof(struct test_struct,f1));

          return 0;

  }

执行结果为:

jibo@jibo-VirtualBox:~/cv_work/work/list/offset $ ./main

offsetof (struct test_struct,num) =0

offsetof (struct test_struct,ch) =4

offsetof (struct test_struct,f1) =8

linux
相关资讯       Linux内核开发  offset 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款