Stay Hungry , Stay Foolish

君子生非异也,善假于物也

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

具体方法

#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。

posted on 2015-08-15 17:52  octocat  阅读(1835)  评论(1编辑  收藏  举报