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

来源:互联网 发布:多久修一次眉毛知乎 编辑:程序博客网 时间:2024/05/24 04:00

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

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

       #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);       }

 

编译运行输出结构:

           offsets: i=0; c=4; d=8 a=16           sizeof(struct s)=16


其实现是:

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

看明白了吗?把地址0强制转化为type的类型,然后取member变量的地址,再转为size_t就是偏移量了,size_t其实就是unsigned long类型。