前言
本文介绍并模拟实现宏offsetof
offsetof介绍
格式:offsetof(type, member)
头文件:<stddef.h>
这个宏有两个参数:
type
是一个结构体类型或联合类型;member
是结构体或联合的某一个成员;
功能:返回成员相对于结构或联合起始地址的偏移量(以字节为单位),返回类型是size_t
。
模拟实现
结构体起始地址加上该成员相对于起始地址的偏移量就是成员变量的地址。
想要知道成员相对于结构体起始地址的偏移量,假设结构体起始地址位于0地址处,那么结构体成员变量的地址强制类型转换为size_t
后就相当于该成员相对于起始地址的偏移量。
#define OFFSETOF(type, member) (size_t)( &( ( ( type* )0 ) -> member) )
- 把整数0强制类型转换为
type*
类型,相当于一个结构体的起始地址位于0地址处; - 接着通过箭头访问操作符访问结构体成员
member
,相当于找到了结构体成员member
; - 取出结构体成员
member
的地址并强制类型转换为size_t
类型;
例子:
代码语言:javascript复制#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))
struct S {
int a;//0~3
char b;//4
//5
short c;//6~7
};
int main() {
printf("%dn", offsetof(struct S, a));
printf("%dn", offsetof(struct S, b));
printf("%dn", offsetof(struct S, c));
printf("%dn", OFFSETOF(struct S, a));
printf("%dn", OFFSETOF(struct S, b));
printf("%dn", OFFSETOF(struct S, c));
return 0;
}
运行结果:
END