转自http://blog.csdn.net/gdutliuyun827/article/details/8440552
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[];
- };
-
-
-
- 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类型。