offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)

简介: offsetof宏(想了解offsetof宏的使用,那么看这一篇就足够了!)

1.什么是offsetof宏

       宏 offsetof(type, member) 会返回一个类型为 size_t 的整型常量,该常量是一个结构体成员相对于结构体开头的字节偏移量。成员是由 member给定的,结构体的名称是在 type 中给定的。(如下图)

参数:

       type:该参数需要填写一个结构体变量;

       member:该参数填写结构体中的一个元素;

返回值:

       该宏返回类型为 size_t 的值,表示 type 中成员的偏移量。

注:但我们使用offsetof宏时,需要包含#include<stddef.h>头文件

#include<stddef.h>

以上我们就了解了什么是offsetof宏,以及offsetof宏的基本参数。

2.offsetof宏的作用和使用

       由上面的讲解我们可以知道,offsetof宏的作用就是计算结构体中的一个成员相对于结构体开始的偏移量,单位为字节,那么如何去使用offsetof宏呢?

我们直接使用实例:

#include<stdio.h>
#include<stddef.h>
//定义一个结构体
struct S
{
  char a;
  int b;
  char c;
  short d;
};
int main()
{
  //offsetof宏的使用
  size_t ret = offsetof(struct S, b);
  printf("%zd", ret);
 
  return 0;
}

如果不知道结构体的对其数和偏移量的同学,可以浏览----------------------------------------------------->结构体的详解(想要彻底了解结构体,那么看这一篇就够了!)-CSDN博客

这样我们就大致的了解了offsetof宏的作用和基本使用。

3.offsetof宏的自我实现

       理解的offsetof宏的使用,那么我们自己如何自我实现offsetof宏呢?

在自我实现offsetof宏之前,我们看一下visual studio官方是如何实现offsetof宏的:

其实我们自我实现offsetof宏的方式就是图中红色下滑线包括的地方。

直接看一下自我实现宏的代码:

#include<stdio.h>
//自我实现offsetof宏
#define OFFSETOF(type,n) (size_t)&(((type*)0)->n)
//定义一个结构体
struct S
{
  char a;
  int b;
  char c;
  short d;
};
int main()
{
  //offsetof宏的使用
  size_t ret = OFFSETOF(struct S, b);
  printf("%zd", ret);
 
  return 0;
}

       代码讲解:

#define OFFSETOF(type,n) (size_t)&(((type*)0)->n)

注:在重点讲解一下(((type*)0)->n)这个代码:

       1.(type*)0:这是将整型0强制转化为了type类型的指针;由于我们知道,指针变量其实是存放元素地址的变量,例如 指针 int * p = & a (a的地址为0x11223344),其实0x11223344只不过是用十六进制表示的一个数字而已,所以地址也是个数字,那么同理,如果我们将整型0强制转化为了type类型的指针,意思也就是 type 指针 = 0,也就是该指针存放数字为 0 的地址;

       2.((type*)0)->n:我们使用 -> 访问成员 n 的时候,指针向后偏移了 n 成员偏移量个单位,所以偏移之后的地址为 0 + n的偏移量。

之后我们取出地址(也就是 0 + n的偏移量),在强制转化为size_t类型即可得到一个偏移值

这样之后我们就完成了offsetof宏的自我实现。

相关文章
|
存储 缓存 人工智能
玄铁 E906处理器简介|学习笔记
快速学习玄铁 E906处理器简介
3493 0
玄铁 E906处理器简介|学习笔记
|
安全 Unix Linux
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
VMware Workstation 17.6.3 发布下载,现在完全免费无论个人还是商业用途
140256 65
|
9月前
|
网络安全 数据安全/隐私保护 开发者
诊断并修复SSH连接Github时遇到的"connection closed"错误。
解决"connection closed"错误往往是一个排除法的过程。需要从基础的网络检查做起,逐步过渡到深入的配置和服务端日志审查。每一步都应当仔细验证,确保不遗漏可能导致连接问题的任何细节。在执行以上步骤后,大多数SSH连接问题可以得到解决。如果所有步骤都未能解决问题,可能需要寻求更专业的技术支持,或者在GitHub社区寻找是否有其他开发者遇到并解决了类似的问题。
1131 0
|
9月前
|
存储 编解码 API
如何利用阿里云OSS进行图片和视频处理?
本文介绍了如何利用阿里云对象存储OSS进行图片和视频处理。内容包括OSS的基本功能、上传与管理媒体资源、图片处理(缩放、裁剪、旋转、水印等)、视频处理(转码、截图、拼接等)以及相关API的使用方法。通过OSS,用户可高效实现多媒体资源的存储与处理,适用于各类企业和开发者。
|
运维 网络协议 安全
|
机器学习/深度学习 人工智能 算法
AI的出现,如何判定程序员的水平高不高?
本文探讨了AI时代评判程序员水平的标准,涵盖基础知识与编程能力、AI技术理解与应用能力、问题解决与创新能力及团队协作与沟通能力等多方面。同时,强调生成式人工智能认证(GAI认证)对程序员职业发展的助力,包括增强专业认可度、拓展职业空间和提升学习能力。程序员需不断学习,适应AI浪潮,以保持竞争力。
|
算法 程序员 开发工具
C语言编程规范
C 语言编程规范有助于提升代码的可读性、可维护性和可移植性。主要包括:命名规范(如 `my_variable`、`MAX_SIZE`)、代码缩进与空格、注释(解释逻辑但不过度)、函数设计(短小精悍、参数不超过三个)、错误处理、避免魔法数字、选择合适数据结构、使用标准库、保持代码格式一致及版本控制。遵循这些规范能显著提高团队开发效率和代码质量。
1870 2
|
负载均衡 Cloud Native 数据可视化
Nacos与Eureka比较?
【6月更文挑战第29天】Nacos与Eureka比较?
926 2