栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

offsetof作用:

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

需要引用头文件

下面是计算实例:
 

计算结果:
 

所以成员 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,然后同理转换成成员的地址后,再减去结构体首地址得到的距离,也是偏移量。

调试结果是:


 

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/743650.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号