【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量

大家好,欢迎来阅读子豪的文章,大家有什么宝贵的意见或建议可以在留言区留言

如果你喜欢我的文章,欢迎 素质三连 点赞 关注 收藏

我的码云仓库:补集王子 (YZH_skr) - Gitee.com

不要偷偷拿走我的小火车哦~嘿嘿

【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量_第1张图片

我们经过前面的学习知道了结构体有内容对齐的隐含条件

目录:

        1. 内容对齐

        2.假设

        3.计算

        5.总结

而C语言提供了计算成员变量的偏移量的函数 offsetof

【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量_第2张图片

C语言本身提供了一个函数来实现这个功能

下面我们来自己写代码来一步步模拟实现它        【宏实现】

1. 内容对齐

定义一个struct类型

【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量_第3张图片

红色区域为对齐浪费掉的空间

2.假设

假设结构体变量的初始位置为 0x00 

由右边 可以看出,地址相对初始0的大小就是偏移量  

 【C语言】宏实现,计算结构体中某变量相对于首地址的偏移量_第4张图片

3.计算

a b c 的地址就为对应的偏移量

0xa - 0x00        0xc - 0x00        0xd - 0x00

4.代码实现 宏

#include 
#include 
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.总结

学习了 宏的用法 和 结构体对齐 与 偏移

你可能感兴趣的:(C语言项目,c语言,开发语言,后端)