大家好,欢迎来阅读子豪的文章,大家有什么宝贵的意见或建议可以在留言区留言
如果你喜欢我的文章,欢迎 素质三连 点赞 关注 收藏
我的码云仓库:补集王子 (YZH_skr) - Gitee.com
不要偷偷拿走我的小火车哦~嘿嘿
我们经过前面的学习知道了结构体有内容对齐的隐含条件
而C语言提供了计算成员变量的偏移量的函数 offsetof
C语言本身提供了一个函数来实现这个功能
下面我们来自己写代码来一步步模拟实现它 【宏实现】
1. 内容对齐
定义一个struct类型
红色区域为对齐浪费掉的空间
2.假设
假设结构体变量的初始位置为 0x00
由右边 可以看出,地址相对初始0的大小就是偏移量
3.计算
a b c 的地址就为对应的偏移量
0xa - 0x00 0xc - 0x00 0xd - 0x00
4.代码实现 宏
#include <stdio.h> #include <stddef.h> struct S { int a; char c; double d; }; //计算 类型 取地址 把结构体零地址的 转换类型 成员 // 本质:&(((structs *)0)-> mem_name) - ((struct s*)0) 减零等于没减 #define OFFSETOF(st_type,mem_name) (size_t)&(((st_type *)0)->mem_name) int main() { //类型名 成员名 printf("%d\n", offsetof(struct S, a)); printf("%d\n", offsetof(struct S, c)); printf("%d\n", offsetof(struct S, d)); return 0; }
5.总结
学习了 宏的用法 和 结构体对齐 与 偏移