关闭

Offsetof

标签: struct编译器
244人阅读 评论(0) 收藏 举报
分类:

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

 

s是一个结构名,它有一个名为m的成员(sm 是宏offsetof的形参,它实际是返回结构s的成员m的偏移地址.

 

(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其地址值

 

&((s *)0)->m   是要取得类s中成员变量m的地址. 因基址为0,这时m的地址当然就是ms中的偏移

 

最后转换size_t 型,即unsignedint

 

有例子如: 

struct  

    int  i; 

    int  j; 

}; 

   

struct   A   *pA; 

pA = new   A; 

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

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

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

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

   

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

 

解析结果是: 

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

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

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

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:22103次
    • 积分:353
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:12篇
    • 译文:0篇
    • 评论:2条
    文章分类
    文章存档
    最新评论