向任何指针添加字节偏移量的可移植且安全的方法

2023-12-29

我对使用 C++ 还很陌生,还没有掌握该语言的所有复杂性和微妙之处。

什么是最便携、正确、安全在 C++11 中向任何类型的指针添加任意字节偏移量的方法?

SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset;             // <--

我在 Stack Overflow 和 Google 上找到了很多答案,但他们都提出了不同的建议。我遇到过的一些变体:

  1. Cast to char * https://stackoverflow.com/q/6449935/146622:

    ptr = (SomeType*)(((char*)ptr) + offset);
    
  2. Cast to unsigned int:

    ptr = (SomeType*)((unsigned int)ptr) + offset);
    
  3. Cast to size_t https://stackoverflow.com/a/14453183/146622:

    ptr = (SomeType*)((size_t)ptr) + offset);
    
  4. “的大小size_t and ptrdiff_t始终与指针的大小一致。因此,这些类型应该用作大型数组的索引,用于存储指针和指针算术。” -关于 size_t 和 ptrdiff_t http://www.codeproject.com/Articles/60082/About-size_t-and-ptrdiff_t在代码项目上

    ptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
    
  5. 或者像以前一样,但是与intptr_t代替size_t https://stackoverflow.com/a/1464194/146622,它是有符号的而不是无符号的:

    ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
    
  6. 仅投射到intptr_t, since offset已经是一个有符号整数并且intptr_t is not size_t https://stackoverflow.com/a/1464194/146622:

    ptr = (SomeType*)((intptr_t)ptr) + offset);
    

在所有这些情况下,使用旧的 C 风格转换是否安全,或者使用起来更安全或更便携static_cast or reinterpret_cast为了这?

我应该假设指针值本身是无符号的还是有符号的?


我会使用类似的东西:

unsigned char* bytePtr = reinterpret_cast<unsigned char*>(ptr);
bytePtr += offset;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向任何指针添加字节偏移量的可移植且安全的方法 的相关文章

随机推荐

  • JS 将参数作为变量传递给匿名函数并稍后调用 -> 参数值问题

    我在调用带有作为变量传递的参数的匿名函数时遇到问题 如果我在将变量作为参数传递给匿名函数后将其保存到数组中 那么我更改变量并调用该函数 它会打印变量的最后一个值 而不是我推送匿名函数时变量的值进入我的数组 我在以下示例中简化了代码 var
  • 使用 R 求解方程

    我如何在 R 中以数值方式求解以下形式的方程的根 f r r c 1 B c exp M B r 其中M B和c是已知常数 提前致谢 由于 R 无法执行此功能 您可能需要使用像 Sage 这样的超集包 Sage 包含 R 和许多其他软件包
  • 着色器编译器如何工作?

    是否有人参考了有关着色器编译器 图形驱动程序编译器内部工作的特定文档和研究 编写普通的C编译器和编写着色器编译器没有太大区别 关于编写编译器的标准书籍是所谓的 龙书 http www amazon com Compilers Princip
  • ASP.NET MVC 4,在将视图模型对象用作操作方法参数之前如何访问/修改视图模型对象(并更改视图和操作方法)?

    ASP NET MVC MVC4 中是否有任何有用的挂钩 可以让您在调用操作方法之前访问操作方法参数 视图模型 然后也可以 例如 取决于您在操作方法中检查的内容的值 参数 让您阻止调用操作方法 即将视图模型对象 操作方法参数 转发到另一个操
  • 在生产中使用 GCC 的 C++0x 模式?

    有人用GCC 4 4 0吗C 0x http gcc gnu org gcc 4 4 cxx0x status html生产支持 我正在考虑将它与最新的 MinGW 一起使用 但我不确定它是否足够成熟 我对 感兴趣 TR1 支持 auto
  • Cloud Functions for Firebase 中的本地依赖项

    当我尝试部署我的功能时 firebase 抱怨这一点 const admin require firebase admin const functions require firebase functions const C require
  • 无法从Python目录中打开文件[重复]

    这个问题在这里已经有答案了 我编写了一个小模块 首先查找目录中的所有文件 然后合并它们 但是 我在从目录打开这些文件时遇到问题 我确保我的文件和目录名称是正确的 并且文件实际上位于该目录中 下面是代码 seqdir results outf
  • java 获取 Active Directory RootDSE

    我正在尝试使用 java 获取 Active Directory rootDSE 这是我到目前为止所做的尝试 public class RootDSE public DirContext context public Attributes
  • 从IP地址查找时区

    当我只有 IP 地址时 有没有办法找到用户所在的时区 我正在寻找需要应用于服务器时间的时间偏移 以便找到用户位置的时间 您需要尝试确定位置 远非 100 准确 看这个问题 https stackoverflow com questions
  • 如何使用 JdbcCursorItemReader 和多线程从 Oracle Db 读取数据

    我有 Spring Batch 应用程序并配置了如下步骤 ThreadPoolTaskExecutor taskExecutor new ThreadPoolTaskExecutor taskExecutor setCorePoolSize
  • 有没有办法防止selenium自动终止空闲会话?

    我正在使用 selenium 来自动化与网站的一些交互 此过程涉及打开多个浏览器并让它们间歇性地执行操作 然而 偶尔会出现长时间 gt 1 小时 不活动的情况 并且 selenium 似乎会在大约 30 分钟没有被调用后自动终止浏览器会话
  • 为什么Java中方法调用中间要使用括号?

    尽管我做了一些广泛的搜索 但我遇到了一些代码 但无法理解它的某些方面 我的问题是 为什么在方法调用中间使用括号 package com zetcode import java awt event ActionEvent import jav
  • 如何使用 apache Camel 创建 IAM 用户?

    我有一个骆驼休息API 我试图使用 apache Camel 框架创建一个 IAM 用户 代码是这样的 gt post iam create user route process new Processor Override public
  • 我应该将安全代码与不安全代码混合在一起吗?

    我正在开发一个使用大量 WIN32 API 调用并需要一些不安全代码的项目 从最佳实践的角度来看 我是否应该将此代码隔离在使用 unsafe 开关编译的其自己的 DLL 中 同时保持主应用程序的安全 换一种方式 有什么理由不使用 unsaf
  • SVN - 在提交主干时提交外部

    简短而甜蜜 我有一个带有外部的项目 它允许我在一项操作中提交对该外部文件的更改以及对主干的更改 我有另一个带有外部的项目 它确实not允许我在主干旁边提交更改 最明显的区别是第二个外部被签出到复合目录 但除此之外我找不到任何区别 据我所知
  • 使用 fclose 到 popen 的管道是一个严重的错误?

    几个月前 我为 Linux 编写了一个 CGI 应用程序 它使用popen 读取命令的输出 然后我关闭管道fclose 现在 我读到关闭管道需要使用pclose 手册说 返回值来自popen 是一个普通的标准I O流 尊重除了它必须关闭pc
  • 名称“演员”未定义

    我在 python 编程方面遇到问题 当我尝试编写游戏时 由书本介绍 Coding Games Python DK 3 它说 名称 Actor 未定义 这是我的代码 import pgzrun from random import rand
  • R中的快速傅立叶变换

    我有一个数据集 其中包含动物在 12 个月内每小时的访问次数 我想使用快速傅里叶变换来检查循环模式和周期性 过去 我为此使用过 Statistica 但是 我想使用 R 来绘制频谱密度与周期的关系图 在 R 中是否有一种简单的方法可以做到这
  • 如何从 PreferenceActivity 外部更改首选项的状态?

    我的应用程序中有一些功能需要 Android 版本 4 2 因此 在我的主要活动中 我需要检查可用的操作系统功能并修改 启用 禁用 我的中定义的首选项项目PreferenceActivity 从外部无法访问以下代码PreferenceAct
  • 向任何指针添加字节偏移量的可移植且安全的方法

    我对使用 C 还很陌生 还没有掌握该语言的所有复杂性和微妙之处 什么是最便携 正确 安全在 C 11 中向任何类型的指针添加任意字节偏移量的方法 SomeType ptr int offset 12345 bytes ptr ptr off