【C语言进阶篇】offsetof宏的介绍 及其实现

2024-04-23 07:20

本文主要是介绍【C语言进阶篇】offsetof宏的介绍 及其实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、offsetof宏的介绍

头文件 :

offsetof宏的通用形式:

参数说明:

用法举例:

二、offsetof宏的实现

三、offsetof宏的使用注意事项


        个人主页:    倔强的石头的博客

        系列专栏 :C语言指南         C语言刷题系列  

一、offsetof宏的介绍

offsetof宏的作用是获取结构体中某个成员相对于结构体起始地址的偏移量。通过计算成员在结构体中的位置,它提供了一种可移植的方法来确定偏移量。

头文件 :

<stddef.h>

offsetof宏的通用形式:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
参数说明:
  • TYPE: 表示结构体或联合体的类型名。当你需要计算某个结构体类型中某个成员的偏移量时,应在此处指定该结构体类型。

  • MEMBER: 表示结构体(或联合体)中需要计算偏移量的成员名称。这是你希望得知其在结构体内部位置的字段。

用法举例:
#include<stdio.h>
#include<stddef.h>
struct ST
{char a;int b;float c;
};
int main()
{printf("%zd\n", offsetof(struct ST, b));printf("%zd\n", offsetof(struct ST, c));return 0;
}

 

二、offsetof宏的实现

(这里用一些更简短的符号表示)

#define MY_offsetof(S,m) (size_t) &(((S*)0)->m)
  • S代表结构体的类型。
  • m代表结构体中的成员。
  • (S*)0这里将整数值0强制转换为指向结构体S类型的指针。这实际上创建了一个指向无效地址(NULL)的指针,但由于我们只是用它来计算偏移量,并不实际访问内存,因此这是安全的。
  • ->m使用->运算符来访问结构体指针的成员m。尽管指针是NULL,但这个操作在编译时仅用于计算偏移量,并不真正执行内存访问。
  • &(((S*)0)->m):取成员m的地址。由于我们有一个指向结构体类型的NULL指针,这个地址实际上就是成员m在结构体中的偏移量。
  • (size_t):将计算出的偏移量转换为size_t类型,这是一个无符号整数类型,通常用于表示对象的大小或内存中的偏移量。

MY_offsetof宏会返回结构体S中成员m的偏移量,这个偏移量是从结构体的起始地址到成员m的地址之间的距离(以字节为单位)。

#include<stdio.h>
#define MY_offsetof(S,m) (size_t)&(((S*)0)->m)struct ST
{char a;int b;float c;
};
int main()
{printf("%zd\n", MY_offsetof(struct ST, b));printf("%zd\n", MY_offsetof(struct ST, c));return 0;
}

 

三、offsetof宏的使用注意事项

  • 仅适用于结构体和联合体:它不能用于普通变量、数组或非聚合类型(即不包含其他成员的简单类型)。

  • 编译时计算offsetof宏是在编译时计算偏移量的,因此它不能用于运行时动态生成的结构体类型或成员名。

  • 不涉及内存访问:虽然宏的表达式看起来像在访问内存,但实际上并没有发生真正的内存访问,因为所使用的指针指向的是未分配的地址。编译器仅依据类型信息计算偏移量,不会导致运行时错误。

这篇关于【C语言进阶篇】offsetof宏的介绍 及其实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928137

相关文章

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Python实现精确小数计算的完全指南

《Python实现精确小数计算的完全指南》在金融计算、科学实验和工程领域,浮点数精度问题一直是开发者面临的重大挑战,本文将深入解析Python精确小数计算技术体系,感兴趣的小伙伴可以了解一下... 目录引言:小数精度问题的核心挑战一、浮点数精度问题分析1.1 浮点数精度陷阱1.2 浮点数误差来源二、基础解决

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方