目录
1,宏offsetof
1.1,声明
此宏(offsetof)就是以函数的形式返回结构体或者联合体类型中成员,成员的字节为单位的偏移量。
通俗点来说就是计算偏移量的。
1.2,函数使用
//宏-offsetof-计算偏移量
struct S1
{
char c1;//1
char c2;//1
int i;//4
};
int main()
{
printf("%d\n", offsetof(struct S1, c1));//偏移量
printf("%d\n", offsetof(struct S1, c2));
printf("%d\n", offsetof(struct S1, i));
printf("%d\n", sizeof(struct S1));//结构体大小
return 0;
}
我们看到从0开始偏移到了4,一共偏移了五个变量,而这个结构体的对齐数是8(vs默认对齐数),那么结构体成员分别对齐数是1,1,4;5不是4的倍数,8是他的倍数,我们看到结构体S1的大小也是8,所以正确。
2,宏offsetof的实现
2.1,宏的实现方法
#define offsetof(type,member) (int)&(((struct S*)0)->member)
1,定义一个常量0。
2,把这个常量装换成结构体指针,就可以访问后面的空间(struct S*)0。
3,是这个结构体指针指向这个参数((struct S*)0)->member。
4,取这个结构体变量的地址&(((struct S*)0)->member)。
5,强制类型转换(int)&(((struct S*)0)->member)。
2.2,使用方法
#define offsetof(type,member) (int)&(((struct S*)0)->member)
/*
1,定义一个常量0
2,把他装换成结构体指针,就可以访问后面的空间
3,使这个结构体的针织指向这个参数
4,取这个结构体变量的地址
5,强制类型转换
*/
struct S
{
char a;
int i;
char c;
};
int main()
{
//printf("%d", sizeof(struct S));
printf("%d\n", offsetof(struct S, a));
printf("%d\n", offsetof(struct S, i));
printf("%d\n", offsetof(struct S, c));
return 0;
}