首页 > 其他分享 >指针加法中的隐形偏差:一次不该有的偏移踩坑

指针加法中的隐形偏差:一次不该有的偏移踩坑

时间:2024-11-13 15:47:25浏览次数:1  
标签:nRerpMode addressOfRerpMode 偏移 infoRom 加法 offsetof TInfoRom 指针

在最近的开发中,有这样的一个需求,给一个结构体,我需要传出这个结构体的个别成员的地址,offsetof这个宏函数可以很好的解决这个业务需求,但是我还是踩坑了。下面看看我的踩坑记录。

我们知道一个(TInfoRom*)infoRom类型的结构体指针,他指向当前结构体变量的首地址。我们可以通过offsetof算出nRerpMode在TInfoRom偏移的字节数再加上当前结构体变量的首地址infoRom。就可以得到我们想要的addressOfRerpMode了。下面我给出了我踩坑之前的代码和修正后的代码。

// 结果理想
addressOfRerpMode = (void*)(     offsetof(TInfoRom, nRerpMode)  + (char*)infoRom);
// 结果不理想
addressOfRerpMode = (void*)((u64)offsetof(TInfoRom, nRerpMode)  +        infoRom);
// 不理想的结果与下面等价
addressOfRerpMode = (void*)((u64)offsetof(TInfoRom, nRerpMode)  * sizeof(infoRom));

infoRom是TInfoRom的指针类型,offsetof(TInfoRom, nRerpMode)的返回值是一个无符号的整型(具体的位数根据操作系统的位数自动适应)。踩坑的原因是我用一个整型去加一个TInfoRom的指针类型,假如offsetof(TInfoRom, nRerpMode)的值为2,那我其实加了2*sizeof(infoRom)的地址。所以需要通过强制转换为(char*),这样再加的话加的就是2*sizeof(char)的地址,就是我们想要的结果了。

这次事故让我深刻认识到,指针的每一步操作都需要足够的严谨性,尤其是在跨类型操作时。指针算术中隐形的偏差,常常在不经意间引入难以察觉的错误。

我们要始终对数据类型的大小、指针的运算方式以及系统对齐要求有深刻的理解。只有这样,才能在复杂项目中编写出稳定且高效的代码。

希望我的这次经历能为你提供一些启示或帮助。如果你也有类似的踩坑经历,欢迎在评论区交流!

标签:nRerpMode,addressOfRerpMode,偏移,infoRom,加法,offsetof,TInfoRom,指针
From: https://www.cnblogs.com/xddisme/p/18544115

相关文章

  • 【轻量化】YOLOv8 更换骨干网络之 MobileNetv4 | 模块化加法!非 timm 包!
    之前咱们在这个文章中讲了timm包的加法,不少同学反馈要模块化的加法,那么这篇就讲解下模块化的加法,值得注意的是,这样改加载不了mobilebnetv4官方开源的权重了~论文地址:https://arxiv.org/pdf/2404.10518代码地址:https://github.com/tensorflow/models/blob/master/offic......
  • C语言指针详解:用法与实例
    目录C语言指针详解:用法与实例引言1.指针基础1.1什么是指针?1.2如何声明指针?1.3获取变量的地址1.4解引用指针2.指针的高级用法2.1指针和数组2.2指针和函数参数2.3指针和动态内存分配3.指针的注意事项3.1空指针3.2悬空指针3.3指针运算C语言指针详......
  • 数组指针与指针数组
    一、指针数组指针数组是一个数组,其中每个元素都是一个指针。这种数组可以用来存储多个指针,每个指针可以指向不同的数据类型。#include<iostream>usingnamespacestd;intmain(){inta=10,b=20,c=30;int*ptr_array[3];//定义一个指针数组,包含3个......
  • 深⼊理解指针(5)[回调函数、qsort相关知识(qsort可用于各种类型变量的排序)】
     目录1.回调函数2.qsort相关知识(qsort可用于各种类型变量的排序)一   回调函数    1定义/作用:把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅......
  • C++笔记---智能指针
    1.什么是智能指针1.1 RALL设计思想RAII(ResourceAcquisitionIsInitialization,资源获取即初始化)是一种资源管理类的设计思想,广泛应用于C++等支持对象导向编程的语言中。它的核心思想是将资源的管理与对象的生命周期紧密绑定,通过在对象的构造函数中获取资源,并在析构函数中......
  • 高级语言调用C接口(一)基础类型与基础类型指针的对应关系
    基础类型C变量类型Java变量类型C#变量类型python变量类型arkts变量类型备注intintintc_intnumberunsignedintlonguintc_uintnumbershortshortshortc_shortnumberunsignedshortintushortc_ushortnumberlongintintc_longnumber32位系统中,C中的long型占4字节,可以当作in......
  • This指针,static(静态成员)
    一、this指针    一个对象由属性(数据)和行为(函数)组成。    每个对象都只存储了自己的数据成员,并没有保存函数。例如,sizeof(d1)==4;    成员函数存储于.text(代码段),只保存一份,则同类型的对象共用。this的类型为:类名*const(例如:Demo*const)问题......
  • 题解:P11062 【MX-X4-T2】「Jason-1」加法
    一道简单的分讨。思路可分成两种情况。当\(a\)和\(b\)同号时:这种情况,显而易见的是\(|a-b|\)的最小值必定是\(|a|,|b|,|a-b|\)之一。当\(a\)和\(b\)异号时:对\((a,b)\)执行欧几里得算法可以将一个变为\(0\),另一个变为\(\gcd(a,b)\)(忽略正负号)。再将\(0\)变......
  • 【编程语言】理解C/C++当中的指针
    指针是C/C++语言中一个非常强大且重要的概念,也是编写高效程序的基础之一。对于没有编程背景的初学者来说,理解指针可能有些难度,但通过本篇文章的介绍,相信你会对指针有一个清晰的认识。本文将从指针的基本概念、作用、代码示例、注意事项等方面,带你一步步了解指针的世界。什......
  • 哈希算法(开散列)- 支持string(this指针指向的理解)
    一.开散列的定义闭散列(开放地址法)的缺点是线性探测和二次探测都会存在哈希冲突的问题,数据越多冲突就会越明显,导致查询数据的时间复杂度大幅度提升个人思路:创建一个指针数组,当某个位置要插入一个数据,就再创建一个数组,指针数组对应位置的指针指向此数组的首元素(数组地址),......