您的位置:首页 > 其它

成员变量在结构体中的偏移——offsetof(type, member)

2016-09-09 15:41 330 查看
转自http://blog.csdn.net/gdutliuyun827/article/details/8440552

size_t offsetof(type, member):看上去像个函数其实这是一个宏;用于求取member成员在类型为type的结构体中的偏移量;(member是type中的一个成员,否则会出错)。

先看一个例子,稍后再看其中的实现。

[cpp] view
plain copy

#include <stddef.h>  

#include <stdio.h>  

#include <stdlib.h>  

  

int  

main(void)  

{  

    struct s {  

        int i;  

        char c;  

        double d;  

        char a[];  

    };  

  

    /* Output is compiler dependent */  

  

    printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",  

            (long) offsetof(struct s, i),  

            (long) offsetof(struct s, c),  

            (long) offsetof(struct s, d),  

            (long) offsetof(struct s, a));  

    printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s));  

  

    exit(0);  

}  



 

编译运行输出结构:

[cpp] view
plain copy

offsets: i=0; c=4; d=8 a=16  

sizeof(struct s)=16  

其实现是:

[cpp] view
plain copy

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

看明白了吗?把地址0强制转化为type的类型,然后取member变量的地址,再转为size_t就是偏移量了,size_t其实就是unsigned long类型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: