你能在同一对象的非重叠区域之间进行memcpy吗?

2024-02-23

C17 说以下内容memcpy[7.24.2.1p2]:

memcpy函数将s2指向的对象中的n个字符复制到指向的对象中 通过 s1。如果复制发生在objects重叠,行为是未定义的。

常见的解释是您不能复制重叠的内存区域。但这并不完全相同,因为同一对象中可能存在不重叠的区域。

想象一个典型的实现,其中sizeof(unsigned int) == 4 and sizeof(unsigned short) == 2。为了简单起见,进一步假设没有陷阱表示,并且alignof(unsigned short) <= alignof(unsigned int)。考虑:

unsigned int x = 0xdeadbeef;
unsigned short *p = (unsigned short *)&x;
memcpy(&x, p+1, 2);

解释#1:我在之间复制x and x,以及物体x当然本身是重叠的,所以我造成了UB。

解释#2:自从<string.h>函数操作“被视为字符类型数组的对象”[7.24.1p1],我正在有效地处理x作为数组unsigned char[4],我只是将该数组的元素 2 和 3 复制到元素 0 和 1。unsigned char对象不会以任何方式重叠,所以我没有引起 UB。我得到了和我一样的效果unsigned char *q = (unsigned char *)&x; q[0] = q[2]; q[1] = q[3];。 (当然,结果值x将由实现定义并且可以是0xdeaddead or 0xbeefbeef或者是其他东西。)

哪种解释是正确的(或者都不正确)?

如果我改为写有什么区别吗memcpy(p, p+1, 2),在这种情况下,我可以说是在不重叠的对象之间复制p[1] and p[0]?


万一使用出现问题unsigned short在上面的例子中,然后考虑

unsigned int x = 0xdeadbeef;
unsigned char *p = (unsigned char *)&x;
memcpy(&x, p+2, 2);
// or
memcpy(p, p+2, 2);

所有相同的论点都应该适用。


(这个问题是后续的ixSci 对另一个问题的评论 https://stackoverflow.com/questions/72334954/why-does-memcpy-cause-compilers-to-seemingly-forget-about-strict-aliasing#comment127804450_72334954.)


None

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

你能在同一对象的非重叠区域之间进行memcpy吗? 的相关文章

随机推荐

  • CSS 翻转卡 Internet Explorer 问题

    我正在尝试让 CSS 翻转卡在 Internet Explorer 11 中工作 我已阅读其他问题 解决方案是在翻转卡功能中添加 ms 前缀 我已经这样做了 但在 IE 11 中 翻转的卡片由于某种原因不显示背面 http jsbin co
  • 如何使用 PDFMake 和 vfs_fonts 在 Node.js 上创建 PDF?

    看起来像这样question https github com bpampuch pdfmake issues 642已经asked https stackoverflow com questions 41314411 create a l
  • 粘性前台服务无法重新启动,并出现“进程损坏”错误

    我有一个已启动的前台服务 我已注意从以下位置返回 START STICKY onStartCommand 我观察到前台服务不会无限期地运行 而是会被称为RestartProcessManager 本质上 维护一个进程 LRU 并且如果配置为
  • 由 __exit__ 中的 __enter__ 返回

    例如 我有这样的代码 with MyClass as x print I have only 0 format x with MyClass as y print I have 0 and 1 format x y print Again
  • SqlExceptionHelper:具有聚集列存储索引的表不支持游标

    我正在尝试从使用聚集列存储索引的 DWH SQL Server 表导入数据kudu通过flume 然而 经过我的习惯flumesource 从数据库检索一定数量的行 出现此异常 SqlExceptionHelper 具有聚集列存储索引的表不
  • 缩放 div 以适合窗口但保持宽高比

    如何缩放 div 以适合浏览器视图端口 但保留 div 的纵横比 我如何使用 CSS 和 或 JQuery 来做到这一点 您不需要为此使用 JavaScript 您可以使用纯CSS padding top 百分比是相对于包含块来解释的wid
  • 投射代理 - 获取 ClassCastException

    当我将动态代理类转换为我想要的对象时 我感到有些奇怪 在运行时 在某些条件下 我收到 ClassCastException 为了更好地解释这一点 这里是我想要使用的类 接口的定义 任何 应该 不相关的扩展接口都用括号括起来 public i
  • 在C中初始化char数组

    我不确定按以下方式初始化后 char 数组中会包含什么 char buf 5 0 这相当于 char buf 5 0 0 0 0 0 是的 是一样的 如果数量较少初始化器比数组中的元素大 那么剩余的元素将被初始化 就像具有静态存储持续时间的
  • 如何在sql server 2008中使用双while循环

    我正在开发一个约会日历应用程序 这里还是新手 我需要这方面的帮助 我需要在列中进行双循环 calendarID Slot Appointment Date slot 列的值将重复为 1 2 3 4 5 6 7 8 到 28 而 calend
  • 分开名字、中间名和姓氏 (Python)

    我有一个包含数百名成员的列表 我想按名字 中间名和姓氏分隔这些成员 但其中一些成员具有前缀 用 P 表示 所有可能的组合 First Middle Last P First Middle Last First P Middle Last P
  • React Native 0.44——堆栈导航器示例

    我正在尝试创建 React Native 应用程序的 Android 版本 但在使用 Android 导航器时遇到问题 下载示例代码 https ufile io lr8x5 首先创建一个文件 例如应用导航 js import StackN
  • 如何将 mat4 数组作为统一传递

    我必须将 mat4 数组作为统一传递给我的顶点着色器 如下所示 在顶点着色器中 uniform mat4 u jointMatrix 2 在我的 C 程序中 我这样做了 glm mat4 jointM 2 I filled jointM w
  • 查询 Android 日历甚至可以检索已删除的事件

    我正在使用下面提到的代码从保存在 Android 本地日历应用程序中的所有日历中检索所有事件 现在 如果我从本机日历中删除某个事件 我的代码仍然会获取并显示该事件 这怎么可能 它是否设置了一些删除标志而不是实际删除事件 Cursor cur
  • C - 使用 select() 时如何限制服务器中的入站连接数

    我对 C 套接字编程还是新手 但我能够创建一些简单的客户端和服务器程序 我正在编写一个监听 TCP 连接的服务器 它的职责是响应客户端的请求 然后在客户端发送特殊的字节序列时 当然 或者当它断开连接时 关闭通信 我开始使用以下代码对服务器进
  • css 规则在 iOS9 上无法正常工作

    我对 iOS9 有一个关于网站 CSS 的问题 css 规则在 Android 和 iOS 8 上运行良好 但在 iOS9 上 网站出现混乱 这就是ios 8和ios 9的区别 可能的问题是什么 我该如何解决这个问题 感谢帮助 css se
  • Dropbox 文件唯一标识符 - RESTful API

    是否存在与 Dropbox 文件关联的唯一标识符 该标识符不会因修订 更改 重命名而更改 并且可以通过 RESTful API 进行访问 我想将它存储在数据库中并跟踪文件上的一些操作 不幸的是 不 Dropbox API 目前不公开任何类型
  • Java中将字符串转换为URL标准字符串

    我有一个字符串 例如 Cerepedia una apliaci n web 我想将其转换为有效的 URL 例如 Cerepedia unaaplicacionweb Note 特殊字符转换和空格删除 顺便问一下 URL 中允许使用逗号吗
  • Ionic:未定义不是构造函数 FileReader

    创建 FileReader 来自 ionic native file 实例时遇到问题 let f new FileReader 出现以下错误 TypeError undefined is not a constructor evaluati
  • 如何列出 Win32.DLL 中的可用方法

    我有一个 DLL 文件 其中包含一些我想在应用程序中调用的有用函数 我不再有它的文档了 如何发现 DLL 导出的函数及其方法签名 是否有列出函数及其参数的实用程序 转储箱 出口 Dumpbin http msdn microsoft com
  • 你能在同一对象的非重叠区域之间进行memcpy吗?

    C17 说以下内容memcpy 7 24 2 1p2 memcpy函数将s2指向的对象中的n个字符复制到指向的对象中 通过 s1 如果复制发生在objects重叠 行为是未定义的 常见的解释是您不能复制重叠的内存区域 但这并不完全相同 因为