当前位置: 首页 > news >正文

C语言 之 memcpy函数的内存重叠问题 及解决该问题的思路

文章目录

  • 函数原型:
    • 例子:
  • 解决方式
    • 整体思路如下:

内存重叠问题主要是使用函数memcpy的时候会发生的

函数原型:

void * memcpy ( void * destination, const void * source, size_t num);

这个函数能够在source指向的空间中拷贝num个字节的内容到destination指向的空间中,当source指向的空间内容与destination指向的空间内容重叠时,就会产生这个问题,达不到预期的结果。

例子:

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memcpy(arr1+2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

首先,我们看上面这个例子,我们要将arr1指向的内容拷贝到arr1+2指向的内容中,拷贝20个字节,由于该数组是int类型,所以20个字节是5个元素。
那么就是这样的:
在这里插入图片描述
我们进行第一次拷贝,把arr1指向的内容拷贝到arr+1指向的内容中,即arr1[2] = arr1[0];
就变成了这样:
在这里插入图片描述
第二次拷贝即arr1[3] = arr1[1]
在这里插入图片描述
我们可以看到,由于两个指针指向的空间都属于一块空间,且有发生重叠,影响了拷贝。
理想的状态是此时的第三次拷贝应该是把原数组的元素3拷贝到arr1+2的位置的,但是由于前面的拷贝,使原数组被改变了,这就是内存重叠导致的问题。

所以后面继续拷贝
20个字节拷贝结束
在这里插入图片描述

所以原本理想的拷贝结果应该是1 2 1 2 3 4 5 8 9 10

在这里插入图片描述
但是现在却变成了 1 2 1 2 1 2 1 8 9 10
在这里插入图片描述

解决方式

所以当存在内存重叠问题的时候,我们就应该使用 memmove函数 ,可以看这里

内存重叠问题解决的主要思路就是根据source指针和destination的指针的前后位置要有不同的拷贝方式,像上面的这种情况就应该使用从后往前的拷贝方式

整体思路如下:

在这里插入图片描述
在这里插入图片描述

这样也可以实现理想的拷贝,拷贝结果为1 2 1 2 3 4 5 8 9 10

具体的memmove函数的模拟实现也可以查看这篇文章


http://www.mrgr.cn/news/11221.html

相关文章:

  • 第八节:Nodify 编辑器属性
  • TortoiseGit使用教程
  • 边缘物联网平台AIoTedge与NodeRED完美结合
  • docker 保持镜像报错:read-only file system
  • 322.零钱兑换
  • 云原生周刊:KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard
  • libevent bufferevent pair 死锁
  • 【数据分享】2000—2022年我国各省份各教育阶段的学校资产情况(免费获取/50多类指标)
  • 18. 分割dataframe:让数据分析更高效
  • 【YOLOv10改进[Conv]】感受野注意力卷积RFAConv(2024.3)| 使用RFAConv 改进v10目标检测效果 + 含全部代码和详细修改方式
  • C#开发基础之100个常用的C#正则表达式
  • 关于kafka的分区和消费者之间的关系
  • 更改了ip地址怎么改回来
  • Excel技能分享:根据匹配公式设置单元格背景色
  • white-space: pre;与white-space: pre-line;的区别
  • K8S部署MySQL5.7的主从服务
  • Linux系统——服务器长时间训练不间断指令(nohup的简单用法)
  • Bootstrap 4 颜色
  • git flow如何切换到develop
  • (十二)Flink Table API