offsetof()

2016-12-02 12:52:06来源:网络收集作者:一线码农人点击

譬如:#defineoffsetof(struct_t,member)((size_t)(char*)&((struct_t*)0)->member)

应该怎么理解呢?


(struct_t*)0是一个指向struct_t类型的指针,其指针值为0,所以其作用就是把从地址0开始的存储空间映射为一个struct_t类型的对象。((struct_t*)0)->member是访问类型中的成员member,相应地&((struct_t*)0)->member)就是返回这个成员的地址。由于对象的起始地址为0,所以成员的地址其实就是相对于对象首地址的成员的偏移地址。然后在通过类型转换,转换为size_t类型(size_t一般是无符号整数)。所以,offsetoff(struct_t,member)宏的作用就是获得成员member在类型struct_t中的偏移量。个人认为其中的(char*)可以省略。


结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:
#defineoffsetof(s,m)(size_t)&(((s*)0)->m)
例如,想要获得S2中c的偏移量,方法为
size_tpos=offsetof(S2,c);//pos等于4


对实时嵌入式系统,MISRA--作为工业标准的C编程规范的Rule120禁止使用offsetof.
============================================================================
#defineoffsetof(s,m)(size_t)(&(((s*)0)->m))
这是offsetof的标准实现,主要是计算出结构体里成员的相对地址偏移量。
这里使用0只是一个使用的技巧,方便计算出偏移量。
根据成员的地址偏移量以及地址可以计算出宿主结构的地址:
成员地址-offset=宿主地址
这个宏用来求一个结构体成员相对于这个结构体首地址的偏移量,
例如:
structzhx{
intlanjuan;
};
这个结构体里的成员lanjuan,它的相对偏移量就是4;
这个宏里的0是地址,(s*)0,这一步是把从0这个地址开始的一块大小的内存解释成这个结构体类型,&(((s*)0)->m),这一步是取这个结构体程序m的地址,结合zhx这个结构体的例子,如果取成员lanjuan的地址,这个地址当然是4,对吧!也就是说,通过这个技巧,我们可以很方便的得到了这个成员偏移量。
size_t其实就是无符号整形,也就是把上面得到的那个地址转成无符号整形====================================================================
其实可以直接使用标准库函数里面的offsetof()来判断结构体里面成员的偏移量。


http://bbs.csdn.net/topics/60122071

相关文章

    无相关信息

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台