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