【C语言】内存函数(memmove)的使用和模拟实现

目录

前言

这篇文章讲述了memcpy的使用、模拟实现和一个未解决的问题内存函数(memcpy)的使用和模拟实现

  • 当我们使用我们模拟的my_memcpy拷贝,当源拷贝地址与目标拷贝地址重叠时,my_memcpy不能按照我们的想法拷贝。

例如:

我们想要把arr1中的1,2,3,4,5拷贝到arr1中的3,4,5,6,7位置上

预期结果应该是1,2,1,2,3,4,5,8,9,10

但是我们调用我们自己写的my_memcpy

这个时候我们就需要用到另一个内存函数:memmove

memmove定义

1.在cplusplus中的定义

  • memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
  • 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

memmove的模拟实现

1、思路

我写了memcpy的模拟实现思路:内存函数(memcpy)的使用和模拟实现

但是还有一个重叠问题需要解决

2、难点

((char*)src+count)>(char*)ret时就会发生重叠现象

  • 1,2拷贝到3,4的位置
  • 当想要把3拷贝到5的位置时发现3的位置已经变成了1

3、解决方法

所以当发生重叠时我们让srcdst从高地址向低地址拷贝

  • dstsrc(char*)dst + count - 1, (char*)src + count - 1开始向前拷贝

    这样重叠就不会影响到我们的拷贝了!!

模拟实现代码

c 复制代码
void* memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count)) {
		
		// 非重叠缓冲区
		// 从较低地址复制到较低高地址
		
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else {
		
		// 重叠缓冲区
		// 从较高地址复制到较低地址
		
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

再次运行看结果:

成功,如我们所想!!

※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

相关推荐
qq_12498707532 分钟前
基于springboot+vue的医疗信息系统(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·毕业设计
fakerth3 分钟前
【OpenHarmony】commonlibrary_c_utils实现
c语言·开发语言·操作系统·openharmony
编织幻境的妖10 分钟前
Python with语句与上下文管理器详解
开发语言·数据库·python
NZT-4819 分钟前
C++基础笔记(一)迭代器和vector
开发语言·c++·笔记
cherry有点甜·20 分钟前
如何获取命令行的配置
java·开发语言
毕设源码-赖学姐24 分钟前
【开题答辩全过程】以 基于java的旅游网站的设计与实现为例,包含答辩的问题和答案
java·开发语言·旅游
没有名字的鬼28 分钟前
Linux 下的静态库和动态库(C语言)
linux·c语言
1024小神29 分钟前
xcode多环境 Dev 、Debug 和 Release变量配置以及怎么切换不同环境
开发语言·macos·ios·swiftui·xcode·swift
上不如老下不如小31 分钟前
2025年第七届全国高校计算机能力挑战赛 决赛 C语言组 编程题汇总
c语言·开发语言
云天徽上31 分钟前
【数据可视化-162】数据见证大爱!企业捐款驰援香港数据可视化分析(Pyecharts实现)
开发语言·python·信息可视化·数据可视化·pyecharts