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


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

相关文章
|
27天前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
36 10
|
26天前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
1月前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
1月前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
1月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
42 1
|
1月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
11天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
27 6
|
1月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
36 10
|
24天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。