大家好,欢迎来阅读子豪的文章,大家有什么宝贵的意见或建议可以在留言区留言
如果你喜欢我的文章,欢迎 素质三连 点赞 关注 收藏
我的码云仓库:补集王子 (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.总结
学习了 宏的用法 和 结构体对齐 与 偏移