具体方法

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

实现解析

(TYPE*)0是一个空指针,如果使用空指针访问成员肯定造成段错误,但是前面的”&”这个符号,表示我们仅仅取MEMBER字段的地址,而不是引用该字段内容,因此不会造成段错误。

另外,结构体中的字段在内存中分配的地址是连续的,当我们去访问某个字段时,例如,&( ( (TYPE*)0 )->MEMBER ) ),会先取得该结构体类型TYPE的地址,然后再计算MEMBER字段的offset;最后,将TYPE的地址加上MEMBER的offset,得到MBMBER字段真正的地址,而这个动作是由编译器帮我们完成的。

比如:使用&(ptr->member)获取member的地址,假设ptr地址为100,那么member的地址就是100+offset,如果ptr地址为0,那么得到的结果就是member在type中的offset。

相关文章:

  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-15
  • 2021-08-13
  • 2022-12-23
  • 2021-08-14
猜你喜欢
  • 2021-08-27
  • 2022-02-20
  • 2021-07-27
  • 2022-12-23
  • 2021-09-20
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案