You need to enable JavaScript to run this app. 使用memcpy存储临时值:为何修改stack后tmp1未自动同步更新?
优惠活动
大模型
产品
解决方案
定价
更多

使用memcpy存储临时值:为何修改stack后tmp1未自动同步更新?

memcpy 的核心运行逻辑

memcpy是逐字节的瞬时值拷贝函数,既不会修改两个传入指针的指向,也不会在源内存块和目标内存块之间建立长期绑定关系。它的执行动作只有一件事:从源指针指向的地址开始,复制指定长度的原始字节到目标指针指向的地址空间,函数返回后,两块内存就彻底成为独立的存储区域,没有任何关联。

第一组测试的现象解释

  • 代码通过两次独立的malloc调用,为stack和tmp1申请了两块物理地址完全不重叠的独立堆内存,两个指针从定义开始就没有任何指向关联。
  • 第一次调用memcpy(tmp1, stack, 4*sizeof(float))时,程序仅把stack块中当时存储的16字节float数据(对应1.0、1.1、1.2、1.3四个值)原样复制到tmp1的独立内存空间中。
  • 后续直接修改stack块中的float值时,修改动作只作用于stack指向的内存区域,不会触发tmp1指向的内存块发生任何变化,因此tmp1中保留的始终是第一次memcpy复制过去的旧值。

常见认知混淆:如果写的是tmp1 = stack;,才会让两个指针指向同一块物理内存,此时任意修改其中一个指针指向的内容,另一个指针读取时都会看到同步变化——因为二者操作的根本是同一块内存区域。memcpy完全不具备这种绑定效果。

第二组测试的现象解释

  • 代码在修改完stack的所有值之后,手动再次调用了memcpy(tmp1, stack, 4*sizeof(float)),相当于第二次把stack中存储的最新16字节数据(对应2.0、2.1、2.2、2.3四个值)重新复制到tmp1的独立内存块中。
  • 复制完成后两块独立内存中的字节内容完全一致,因此打印结果显示两个数组的取值完全同步。

第二组代码的隐蔽bug

代码中两个指针的内存申请长度存在越界问题:

stack = (float *) malloc(4);
tmp1 = (float *) malloc(4);

这里仅申请了4字节长度(刚好容纳1个float值),但后续代码却访问了stack[1]到stack[3]共3个超出申请范围的float元素,属于C语言中的未定义行为,当前测试环境下未触发崩溃属于偶然情况,正确的申请逻辑应为malloc(4 * sizeof(float)),即第一组代码中的写法。

为什么不存在自动同步

C语言没有内置的内存块绑定、变更监控机制,所有内存拷贝都是一次性的瞬时动作。如果要实现两个存储区域的内容长期一致,只有两种可行方式:

  • 放弃独立内存申请,直接让两个指针指向同一块物理内存(即通过指针赋值实现);
  • 每次修改完源内存块的内容后,手动再次调用memcpy将最新值复制到目标内存块。

内容的提问来源于stack exchange,提问作者Thomas D.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 11:36:04