【C语言刷题】模拟实现offsetof宏

news2025/2/25 18:19:33

本篇文章目录

  • 1. 宏offsetof的作用
  • 2. 分析该如何模拟实现
  • 3.模拟实现

1. 宏offsetof的作用

在www.cplusplus.com中对offsetof宏的功能描述:
在这里插入图片描述

这个宏的作用就是传入一个结构体类型和一个成员名,返回这个成员相对比这个结构体起始位置的偏移量(字节数),如果不懂的话可以看这篇文章:计算结构体的大小!结构体内存对齐的意义是什么?。

2. 分析该如何模拟实现

有这么一个结构体:

struct Test {
	char c;
	int a;
	char* str;
};

根据结构体的内存对齐规则,得出它的大小与成员的内存布局如下(假设机器是64位平台):
在这里插入图片描述
那么如何得到c、a或str相对于起始位置的偏移量呢?其实非常简单,比如想要得到c的偏移量,用c、a或str的地址减去这个结构体的起始位置,得到的就是中间相差的字节数,这个字节数也就相当于相对于起始位置的偏移量了。
在这里插入图片描述

3.模拟实现

#include <stdio.h>
#include <stddef.h> 

// 模拟实现offsetof宏
#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))

struct Test {
	char c;
	int a;
	char* str;
};

int main() {
	printf("%zd ", offsetof(struct Test, c));
	printf("%zd ", offsetof(struct Test, a));
	printf("%zd\n", offsetof(struct Test, str));
	
	printf("%zd ", OFFSETOF(struct Test, c));
	printf("%zd ", OFFSETOF(struct Test, a));
	printf("%zd\n", OFFSETOF(struct Test, str));
	return 0;
}

运行结果对比:
在这里插入图片描述

&(((type*)0)->member)我认为在0的位置处有一个type*的结构体,然后将它的成员地址取出,这个成员的起始地址就是相对于结构体起始位置的偏移量了,因为结构体的起始位置我认为是0,成员地址减去0的地址等于不用减。一般而言,0这种地址是不能使用的,但我这里并没有解引用,只是看看但不用是没有问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习零基础教程

代码运行软件安装&#xff1a; anaconda:一个管理环境的软件–>https://blog.csdn.net/scorn_/article/details/106591160&#xff08;可选装&#xff09; pycharm&#xff1a;一个深度学习运行环境–>https://blog.csdn.net/scorn_/article/details/106591160&#xf…

c语言内功修炼--深度剖析数据的存储

前言&#xff1a; 我们知道在c语言中的几种基本内置数据类型&#xff0c;分别是&#xff1a; char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数 在…

【】02-02序列求和----二分检索

数列求和公式&#xff1a; 例子&#xff1a; 二分检索算法:&#xff08;有序数列&#xff09; 输入的分析结果&#xff1a; 比较t次的输入个数&#xff1a; 比较K次&#xff0c;是还需要加上间隙处的情况。 如k2;下标 1 2 3 比较k次时 low1,high3 while 第1次循环 &…

卷积神经网络手写字符识别 - 深度学习 计算机竞赛

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

PLC 学习day02 硬件输入/输入的知识

1.资料来源 1.链接&#xff1a;三菱PLC视频教程全集之FX3U基本单元输入接线_哔哩哔哩_bilibili 2. 链接&#xff1a; 三菱plc视频教程全集之FX3U基本单元输出接线_哔哩哔哩_bilibili 2. PLC 的输入部分器件连接。 2.1 PLC输入部分的硬件知识 1. 一般输入部分是PLC获取信息的地…

界面组件DevExpress WPF v23.1 - 全面升级文档处理功能

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

分享一个简单容易上手的CSS框架:Pure.Css

雅虎&#xff08;Yahoo!&#xff09;创建了一个简单的CSS框架&#xff0c;被称为Pure.css&#xff08;https://purecss.io/&#xff09;&#xff0c;以提供一套基础样式集&#xff0c;可作为网页开发的起点。Pure.css旨在轻量、模块化和响应式&#xff0c;使构建快速加载、适用…

Python 创建或读取 Excel 文件

Excel是一种常用的电子表格软件&#xff0c;广泛应用于金融、商业和教育等领域。它提供了强大的数据处理和分析功能&#xff0c;可进行各种计算和公式运算&#xff0c;并能创建各种类型的图表和可视化数据。Excel的灵活性使其成为处理和管理数据的重要工具。本文将介绍如何使用…

【整理】旅行商问题(traveling salesman problem,TSP)

旅行商 一个旅行商由某市出发&#xff0c;经过所有给定的n个城市后&#xff0c;再 回到出发的城市。除了出发的城市外&#xff0c;其它城市只经过一 回。这样的回路可能有多个&#xff0c;求其中路径成本最小的回路。 蛮力【穷举】 【例4-4】旅行商问题——排列树 计算模型…

CSS3选择器详解 前端开发入门笔记(六)

CSS3选择器是一种用于定位HTML元素的方式&#xff0c;它们可以使样式表更加精确地应用到特定的元素。下面是一些常用的CSS3选择器&#xff1a; 元素选择器&#xff08;Element Selector&#xff09;&#xff1a;使用元素名称作为选择器&#xff0c;匹配对应名称的所有元素。例如…

esp32 arduino使用多个串口时如何查看serial1,serial2所对应的引脚定义

如上图所示可以通HardwareSerial.cpp找到起对应的引脚去连接设备即可

5.12.webrtc接口调用过程

嗨&#xff0c;大家好&#xff0c;我是李超&#xff0c;在上节课中呢&#xff0c;我向你介绍了外接口的设计以及我们红接口展开之后的样子&#xff0c;对吧&#xff1f;那今天呢&#xff1f;我们再来看看整个接口调用过程。那整个这个调用过程啊&#xff0c;非常的复杂&#xf…

域控操作二:设置域用户使用简单密码

过程太多简单 直接写出路径更改即可 组策略—计算机配置----策略—Windows设置–安全设置----账户策略–密码策略 按自己想法改就行了 注意一点&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 要么自己设置策略&#xff0c;要么从默认策略改&#xff01;&am…

数学分析:傅里叶级数

卓里奇书好的一点就是&#xff0c;不是直接引出公式&#xff0c;而是告诉你理由。先引出正交的概念&#xff0c;然后在函数空间中&#xff0c;也有正交&#xff0c;只不过是无限维的空间。 这里要注意&#xff0c;明确说明了是有限个。 在函数空间里面&#xff0c;内积是指进行…

CUDA编程入门系列(九)CUDA程序执行与硬件映射

一、GPU流式多处理器 1.kernel的线程组织层次&#xff0c;一个kernel实际上会启动很多线程&#xff0c;这些线程时逻辑上并行的&#xff0c;但是在物理层上不一定是并行的。 2.GPU硬件的一个核心组件时SM&#xff0c;streaming multiprocessor 流式多处理器 3.SM的核心组件包括…

数字电子技术——半导体存储电路

一、半导体存储电路概述 1.存储电路及其分类 存储单元&#xff1a;一位数据 寄存器&#xff1a;一组数据 存储器&#xff1a;大量数据 2.存储单元分类 1&#xff09;静态存储单元 门电路连接而成 2&#xff09;动态存储单元 电容电荷积累 3.存储单元的触发方式与逻辑…

SSH连接华为交换机慢

ssh连接交换机慢是因为交换计算密钥算法阶段默认使用安全性更高的秘钥&#xff0c;由于性能问题导致连接比较慢&#xff0c;如一台华为S5735S-L24T4S-QA2的交换机默认使用如下秘钥&#xff0c;安全行由高到低。 ssh server key-exchange dh_group16_sha512 dh_group15_sha512 …

firewalld常用的基础配置

firewalld防火墙是centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。 支持IPv4、IPv6防火墙设置以及以太网桥支持服务或应用程序直接添加防火墙规则接口拥有两种配置模式&#xff1a;临时模…

C#桶排序算法

前言 桶排序是一种线性时间复杂度的排序算法&#xff0c;它将待排序的数据分到有限数量的桶中&#xff0c;每个桶再进行单独排序&#xff0c;最后将所有桶中的数据按顺序依次取出&#xff0c;即可得到排序结果。 实现原理 首先根据待排序数据&#xff0c;确定需要的桶的数量。…

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合&#xff08;Link Aggregation&#xff09;是将多条物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …