C语言offsetof宏的作用和模拟实现

offsetof作用:

offsetof作用:计算结构体成员相对于结构体偏移量,简而言之就是计算结构体成员相对于结构体首地址的距离。

需要引用头文件<stddef.h>

下面是计算实例:
 

计算结果:
 

所以成员 a偏移量是0,b是4,c是8。
那计算完偏移量后的作用是什么呢?
计算完偏移量后作用是为了计算结构体占用内存大小,详细请看:

C语言深度理解结构体(内存对齐、位段、偏移量、柔性数组)_SPMAX的博客-CSDN博客

offsetof宏的模拟实现:

首先要明白offsetof宏的作用是计算结构体的偏移量,也就是结构体成员相对于结构体首地址的距离,这里要强调的是“距离”,这么理解的话可以有两个思路:
1:找到成员地址,找到结构体的地址,两者相减得到距离。
2:通过内存对齐的规则,从结构体首地址向后根据成员类型进行后移x个字节然后找到对齐的位置,计算移动的x字节,该x字节就是偏移量。


从这两个思路可以知道明显是思路一更加简便,下面就是思路一的实现代码:

思路是:
定义一个宏,将0转化成想要计算的结构体指针类型,找到想要计算的结构体成员,然后整体转换成该成员地址,然后再强制类型转换成整形大小,得到距离。

这里他要特别强调的是为什么用”0“来转换成结构体指针再找其成员,因为这样可以通过“0”这个地址来根据结构体的计算方法来找到成员的地址,比如说“0”这个地址,转换成结构体指针类型的地址,其值还是“0”,但是地址类型变成了结构体类型,然后再通过“->”来找到成员再转换成地址,就变成了该结构体成员的地址,若该成员偏移量是4,那么就会变成“0+4”,再变成整形4就是偏移量。

若理解不了的话,也可以将0替换成某个地址0xff4400,然后同理转换成成员的地址后,再减去结构体首地址得到的距离,也是偏移量。

调试结果是:


 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值