Rust: offset祼指针操作

offset是偏移元素个数,不是字节数!

fn main(){let student_a = Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b = Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let student_c = Student{id:20240003,name:"王二狗".into(),class_id:3,age:14,grade:1};let student_d = Student{id:20240004,name:"吴七喜".into(),class_id:3,age:24,grade:1};let students= vec![student_a, student_b, student_c, student_d];let class = Class{students,class_id:3,grade:1};let student_size = std::mem::size_of::<Student>(); // student结构体大小let student_align= std::mem::align_of::<Student>();//student内部对齐println!("student_size:{:?} student_align:{:?}",student_size,student_align);let class_ptr   = &class as *const Class;let student_a_ptr = &class.students[0] as *const Student;println!("student_a value :{:?}",unsafe{&*student_a_ptr as &Student});//let student_b_ptr = unsafe{ student_a_ptr.add(1)}; // 也可以用add这种方式// 注意:offset不是偏移字节数,而是偏移元素个数!let student_b_ptr = unsafe{ student_a_ptr.offset(1)}; // offset方式let offset_between_a_and_b = unsafe{student_a_ptr.offset_from(student_b_ptr)};println!("offset_between_a_and_b:{}",offset_between_a_and_b);// -1println!("student_b value name :{:?}",unsafe{&*student_b_ptr as &Student}.name);//let student_c_ptr = unsafe{ student_a_ptr.add(2)};let student_c_ptr = unsafe{ student_a_ptr.offset(2)};let student_d_ptr = unsafe{ student_a_ptr.offset(3)};println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[1],student_b_ptr);println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[2],student_c_ptr);println!("student_b ref ptr address : {:p} convert raw ptr address : {:?}",&class.students[3],student_d_ptr);}
// 某某中学
// 班级
struct Class{students: Vec<Student>,//学生class_id: u32, //3班grade:u32, //高3
}
#[derive(Debug)]
struct Student{id: u32, //学号 2024000001;name: String, // 姓名,name="张三"class_id: u32, //班级,class_id=3,3班age: u32, //年龄grade: i8, //年级,grade=1,高中一年级
}

输出:

student_size:40 student_align:8
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
student_a value :Student { id: 20240001, name: "张三娃", class_id: 3, age: 14, grade: 1 }
offset_between_a_and_b:-1
offset_between_a_and_b:-1
student_b value name :"李四牛"
student_b ref ptr address : 0x1c2ff7f6f48 convert raw ptr address : 0x1c2ff7f6f48
student_b ref ptr address : 0x1c2ff7f6f70 convert raw ptr address : 0x1c2ff7f6f70
student_b ref ptr address : 0x1c2ff7f6f98 convert raw ptr address : 0x1c2ff7f6f98

其实,你可以通过offset函数源码,可以了解更清楚,在offset内部,会再以bytes的倍数进行check_add。

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

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

相关文章

安装CPU版的torch(清华源)

1、安装指令&#xff1a; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功&#xff0c;如下图

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…

Java 日志类库

Java 日志库是最能体现 Java 库在进化中的渊源关系的&#xff0c;在理解时重点理解日志框架本身和日志门面&#xff0c;以及比较好的时间等。要关注其历史渊源和设计&#xff08;比如桥接&#xff09;&#xff0c;而具体在使用时查询接口即可&#xff0c;否则会陷入 JUL&#x…

了解VC++ OpenGL绘制模型时设置窗口像素格式

最近看到一个源码,可以读取obj格式模型,显示模型;显示的模型如上一篇博文; 它在视类窗口创建的时候,执行如下的一些, int CRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;HWND hWnd = GetSafeHwnd();HDC…

【Rust自学】6.3. 控制流运算符-match

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 6.3.1. 什么是match match允许一个值与一系列模式进行匹配&#xff0c;并执行匹配的模式对应的代码。模式可以是字面值、变量名、通配符等…

聚类之轮廓系数

Silhouette Score&#xff08;轮廓系数&#xff09;是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i&#xff1a; a(i): 数据点 i 到同簇内其他点的平均距离&#xff08;簇内不相似度&#xff…

unity弹出新的类似独立场景窗口独立运行一般怎么实现?

在Unity中实现弹出类似独立场景窗口并独立运行的功能&#xff0c;通常需要采用一些特定的方法或工具&#xff0c;因为Unity本身并没有直接提供这种功能的内置选项。以下是一些可能的实现方法&#xff1a; 1. 使用多个Scene&#xff08;场景&#xff09; 加载新Scene&#xff…

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题&#xff0c;这个问题主要是涉及到一条sql语句的执行&#xff0c;在此分享下这个报错的处理过程。 问题表现为&#xff1a;一样的表结构和数据&#xff0c;执行相同的SQL&#xff0c;在Oracle数据库中执行正常&…

【电路笔记 信号】Metastability 平均故障间隔时间(MTBF)公式推导:进入亚稳态+退出亚稳态+同步器的可靠性计算

这是一个简化的电路分析模型。图2中的典型触发器包括主锁存器、从锁存器和去耦反相器(这个结构类似 主从边沿触发器)。 在亚稳态中&#xff0c;主锁存器的节点A、B的电压电平大致在逻辑“1”&#xff08;VDD&#xff09;和“0”&#xff08;GND&#xff09;之间。确切的电压电平…

【C++】B2066救援题目分析和解决讲解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af; 题目&#x1f4af; 题目分析每个屋顶计算的元素 &#x1f4af; 思路解析1. **读取输入**2. **计算屋顶时间**3. **结果精确取整** &#x1f4af; 完整解决代码&#x1f4a…

springboot创建web项目

一、创建项目 二、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

RAID5原理简介和相关问题

1、RAID5工作原理 2、RAID5单块硬盘的数据连续吗&#xff1f; 3、RAID5单块硬盘存储的是原始数据&#xff0c;还是异或后的数据&#xff1f; 4、RAID5的分块大小 ‌RAID5的分块大小一般选择4KB到64KB之间较为合适‌。选择合适的分块大小主要取决于以下几个考量因素&#xff1…

重温设计模式--模板方法模式

文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义&#xff1a;定义一个操作中的算法骨架&#xff0c;而降一些步骤延迟到子类中。模板方法使得…

Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录 背景 分析 解决方案 背景 正常情况下&#xff0c;会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时&#xff0c;总会返回非json数据。这是什么问题呢&#xff1f; 分析 期望的完整响应数据如下&#xff1a; {"session": {"inp…

【记录——解除网课自动暂停】的“魔法“

&#x1f33f; 因为快期末了&#xff0c;所以就在刷雨课堂&#xff0c;但是这个东东每次离开页面都会暂停&#xff0c;所以去网上搜集了一些大佬的博客&#xff0c;最后选出来几个 亲测有效 记录一下 &#x1f33a; 也感谢大佬们&#xff01;&#xff01; blog1 我比较喜欢bl…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天&#xff0c;正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴&#xff0c;可扩展至12轴的运动控制…

SpringBoot状态机

Spring Boot 状态机&#xff08;State Machine&#xff09;是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机&#xff08;Finite State Machine, FSM&#xff09;的概念&#xff0c;允许开发者定义一组状态、事件以及它们之间的转换规则。…

基于图注意力网络的两阶段图匹配点云配准方法

Two-stage graph matching point cloud registration method based on graph attention network— 基于图注意力网络的两阶段图匹配点云配准方法 从两阶段点云配准方法中找一些图匹配的一些灵感。文章提出了两阶段图匹配点云配准网络&#xff08;TSGM-Net&#xff09; TSGM-Ne…

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

Flutter动画学习二

如何在 Flutter 中使用自定义动画和剪裁&#xff08;clipping&#xff09;实现一个简单的动画效果。 前置知识点学习 AnimationController AnimationController 是 Flutter 动画框架中的一个核心类&#xff0c;用于控制动画的生命周期和状态。它提供了一种灵活的方式来定义动…