offsetof宏的用法

Offsetof()宏

定义:#define offsetof(s,m)  (size_t )( &(((s *) 0)->m))

参数说明:s为结构体名称,m为结构体内某成员;

作用:计算结构体s内成员m相对于结构体起始位置的偏移地址;

 

以下为某位高手的解说:

struct AAA

    int i; 

int j; 

 }; 

 

struct AAA *pAAA; 

pAAA=new AAA;

 

这时,pAAA实际上是一个Pointer, 指向某一确定的内存地址,比如0x1234; 

而 pAAA->i 整体是一个int型变量,其地址是&(pAAA->i) ,'&'为取址运算符; 

那么&(pAAA->i)一定等于0x1234,因为i是结构体AAA的第一个元素。 

而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因为sizeof(int) = 4;

 

这个做法的巧妙之处就是:它把“0”作为上例中的pAAA,那么 &(pAAA->j)就是j的offset啦。

 

解析结果是: 

 (s*)0 ,将 0 强制转换为Pointer to "s" 

可以记 pS = (s *)0 ,pS是指向s的指针,它的值是0; 

那么pS->m就是m这个元素了,而&(pS->m)就是m的地址,而在本例中就是offset

 

再把结果强制转换为size_t型的就OK 了,size_t其实也就是int啦!!

也就是说:

0 ---> (s *)0

原来的0是数值类型,现在是结构体指针类型,尽管类型变了,但其值还是不变,也就是说还是0,但这个值的意义变了,现在是地址,而不是数值。

 

&(((s*)0)->m)求出字段m的地址值,但由于首地址是0,所以&(((s *)0)->m)求出字段m相对于首地址的偏移值。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值