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

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

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


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


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


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


ac3b3e297d75414f96df5bace5189550.gif


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


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


bb50687e0391478594e2585447351d5b.png


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


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


1. 内容对齐


定义一个struct类型


345f3cf5e3d94b7186ce2cee7db6c623.png


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


2.假设


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


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


007180cd48274fbfbb50e017145a9b26.png


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


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

相关文章
|
1天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(下)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
6 0
|
1天前
|
C语言
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)(上)
C语言进阶21收尾(编程练习)(atoi,strncpy,strncat,offsetof模拟实现+找单身狗+宏交换二进制奇偶位)
9 0
|
1天前
|
自然语言处理 编译器 Linux
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(下)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
5 0
|
1天前
|
程序员 编译器 C语言
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(中)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
11 0
|
1天前
|
存储 程序员 编译器
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)(上)
C语言进阶⑳(程序环境和预处理)(#define定义宏+编译+文件包含)
10 0
|
1天前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(下)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
8 0
|
1天前
|
存储 C语言
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(中)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
8 0
|
1天前
|
编译器 C语言 C++
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)(上)
C语言进阶⑮(自定义类型)(结构体+枚举+联合体)(结构体实现位段)
7 0
|
1天前
|
C语言
C语言初阶⑧(结构体)知识点和笔试题
C语言初阶⑧(结构体)知识点和笔试题
6 0
|
5天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
18 0