01内存对齐之结构体偏移量
前提概念
结构体偏移量:所谓偏移量,就是我们每个结构体成员的首地址而已。
1 求结构体成员偏移量的两中办法
1)简单求结构体成员偏移量 。
// 注意:求偏移量时,必须将地址转成int整数才能求偏移量,不能直接地址相减,否则会默认先转成int型,4字节对应1个int。
typedef struct TEACHER {
char name[4];
int age;
int id;
}Teacher;
int main(){
Teacher t1;
Teacher *p = &t1;
int size1 = (int)(&p->age) - (int)p; // &(p->age)表示取存放age值的首地址
printf("%d\n", size1);
return 0;
}
2)绝对零地址法求。
// 每个结构体内部均有一个绝对零地址即结构体首地址(这里指p) 写法为"(类型 *)0"
int size2 = (int)&(((Teacher*)0)->age);
printf("%d\n", size2);
2 完整代码测试与结果分析
1)测试
#include<stdio.h>
typedef struct TEACHER {
char name[4];
int age;
int id;
}Teacher;
void test01() {
Teacher t1;
Teacher *p = &t1;
printf("%x\n", &p->age);
printf("%x\n", p);
// 两种错误求法测试
printf("%x\n", (&p->age - p)); // 地址相减后会默认转成int 0xc - 0x8=4字节,刚好对应1个int. 所以再以%x输出实际已经是1了
int size = (int)(&p->age - p);
printf("%d\n", size);
// 正确求法测试
int n1 = (int)(&p->age);
printf("%d\n", n1);
int n2 = (int)(p);
printf("%d\n", n2);
// 1 简单求结构体成员偏移量 // 注意:必须转成int整数才能求偏移量,不能直接地址相减,否则会默认先转成int型 4字节对应1个int
int size1 = (int)(&p->age) - (int)p; // &(p->age)表示取存放age值的首地址
printf("%d\n", size1);
// 2 绝对零地址法求
// 每个结构体内部均有一个绝对零地址即结构体首地址(这里指p) 写法为"(类型 *)0"
int size2 = (int)&(((Teacher*)0)->age);
printf("%d\n", size2);
}
int main() {
test01();
// 总结:结构体内部偏移量以0开始。
return 0;
}
2)结果分析