题目名称:写一个宏,计算结构体中某变量相对于首地址的偏移
了解offsetof
在我们C语言中其实就有这个,可以实现题目要求。
我们可以看到这个的头文件是
思路分析
要想找出结构体中某元素相较于首元素的偏移量,首先要确定首元素的位置,这里就可以用到一个小技巧:
如果对数字 0 进行强制类型转换,将它转换为指针,也就是地址,那么此时的数字 0 就代表位置在 0 处的地址。
那么如果我们将数数字 0 强制类型转换为结构体类型的指针时,就相当于,我们在 0 地址处开辟了一个结构体
(type*)0
我们再将它用 -> 指向我们要求的结构体变量的名字,然后取地址,该地址就是该结构体变量距离 0 地址处距离的大小。
我们又知道地址一般是以十六进制的方式存储,每次加一就是一个字节的距离。
&(((type*)0)->member)
然而,此时的数据是地址的形式,那么我们再将它进行强制类型转换,转换为(size_t)的格式,就是无符号整数,这样我们就巧妙的取出了偏移量。
#define OFFSETOF(type,member) (size_t)&(((type*)0)->member)
代码实现
#define OFFSETOF(type,member) (size_t)&(((type*)0)->member)
#include<stdio.h>
struct A
{
int a;
char b[10];
int c;
};
int main()
{
printf("%d ", OFFSETOF(struct A, a));
printf("%d ", OFFSETOF(struct A, b));
printf("%d ", OFFSETOF(struct A, c));
return 0;
}
运行结果: