目录
- 前言
- memmove定义
- 1.在cplusplus中的定义
- memmove的模拟实现
- 1、思路
- 2、难点
- 3、解决方法
- 模拟实现代码
前言
这篇文章讲述了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、解决方法
所以当发生重叠时我们让src
和dst
从高地址向低地址拷贝
- 让
dst
和src
从(char*)dst + count - 1
,(char*)src + count - 1
开始向前拷贝
这样重叠就不会影响到我们的拷贝了!!
模拟实现代码
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);
}
再次运行看结果:
成功,如我们所想!!
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持