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


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

相关文章
|
2月前
|
存储 C语言
如何在 C 语言中实现结构体的深拷贝
在C语言中实现结构体的深拷贝,需要手动分配内存并逐个复制成员变量,确保新结构体与原结构体完全独立,避免浅拷贝导致的数据共享问题。具体方法包括使用 `malloc` 分配内存和 `memcpy` 或手动赋值。
45 10
|
2月前
|
存储 大数据 编译器
C语言:结构体对齐规则
C语言中,结构体对齐规则是指编译器为了提高数据访问效率,会根据成员变量的类型对结构体中的成员进行内存对齐。通常遵循编译器默认的对齐方式或使用特定的对齐指令来优化结构体布局,以减少内存浪费并提升性能。
|
2月前
|
编译器 C语言
共用体和结构体在 C 语言中的优先级是怎样的
在C语言中,共用体(union)和结构体(struct)的优先级相同,它们都是用户自定义的数据类型,用于组合不同类型的数据。但是,共用体中的所有成员共享同一段内存,而结构体中的成员各自占用独立的内存空间。
|
2月前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
2月前
|
编译器 C语言 C++
C语言结构体
C语言结构体
28 5
|
2月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
3月前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
7月前
|
C语言
C语言常量与变量、字符串与转义字符
C语言常量与变量、字符串与转义字符
52 0
|
C语言 C++
【C】C语言数据类型、常量变量的介绍
在C语言中没种数据类型所占的空间大小是不一样的,在这里给大家介绍一个库函数:sizeof,它可以计算每种数据类型所占的空间的大小,我们可以用代码来计算每种类型所占的空间的大小,如下:
|
C语言
C语言初阶之常量和变量
在C程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,直接常量是可以不经说明而直接引用的,而符号常量和变量则必须先定义后使用。