目录
1.offsetof的介绍
offsetof是c语言中宏定义,用于计算结构体成员变量的偏移量,它的作用是返回一个指定结构体中某个成员的偏移量,以字节为单位
2.offset宏的实现
#include<stdio.h>
#define OFFSETOF(type,mem) (size_t)&(((type *)0)->mem)
struct S
{
int a;
char b;
int c;
char d;
};
int main()
{
printf("%zd\n", OFFSETOF(struct S, a));
printf("%zd\n", OFFSETOF(struct S, b));
printf("%zd\n", OFFSETOF(struct S, c));
printf("%zd\n", OFFSETOF(struct S, d));
return 0;
}
运行结果如下:
剖析 (size_t)&(((type *)0)->mem)
1.代码中的0本来是整型,用(type *)强制转换为type*类型,相当于0地址处有个结构体数据,此时,每个成员的偏移量就是相对0的偏移量,这样就不用减去首地址了
注意:这里并不会访问0这个地址,而是拿到0这个地址,和访问0处的地址是两回事,编译器也不会让你访问0处的地址的
2.对该指针用->访问成员,并取出地址,因为结构体的起始地址为0,所以成员的偏移量就相当于对0(首地址)的偏移量
3.取出该成员的地址,强制转换成size_t类型,并以%zd的形式打印偏移量
若有问题,欢迎大家指正