加入收藏 | 设为首页 | 会员中心 | 我要投稿 江门站长网 (https://www.0750zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Linux内核开发:offset宏的分析

发布时间:2021-11-21 21:37:56 所属栏目:教程 来源:互联网
导读:1.offset宏讲解 #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE*)0)-MEMBER) 对这个宏的讲解我们大致可以分为以下4步进行讲解: 1( (TYPE *)0 ) 0地址强制 转换 为 TYPE结构类型的指针; 2((TYPE *)0)-MEMBER 访问TYPE结构中的MEMBER数据成员; 3( ( (TYP

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)=%dn",offsetof(struct test_struct,num)-4);
 
    printf("offsetof (structtest_struct,ch) =%dn",offsetof(struct test_struct,ch)-4);
 
    printf("offsetof (struct test_struct,f1)=%dn",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) =%dn",offsetof(struct test_struct,num));
 
    printf("offsetof (structtest_struct,ch) =%dn",offsetof(struct test_struct,ch));
 
    printf("offsetof (struct test_struct,f1)=%dn",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

(编辑:江门站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读