在学习C语言时,我们就知道C语言规定:1.memcpy只要处理不重叠的内存拷贝就可以
2.memove处理重叠内存的拷贝
在模拟memove时,我们需要分成三种情况(dest为拷贝到的起始地址,src是要被拷贝的起始地址):
一、dest在src前面
![](https://i-blog.csdnimg.cn/blog_migrate/c0bdef53b18477565ac5abab6a281cb2.png)
这种情况只用从后向前覆盖即可
二、dest在src后面
![](https://i-blog.csdnimg.cn/blog_migrate/ca7bc79ff0ef7affda05c922b42c73c4.png)
在这种情况下,我们就不能再由前向后覆盖了,可能会使数据丢失,而导致拷贝的不正确,所以我们可以试试由后向前拷贝
三、dest == src
这种情况,以上方法都可以哟!!
void* my_memove(void* dest, void* src, size_t count)
{
void* ret = dest;
if (dest < src)
{
while (count--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
while (count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
my_memove(arr, arr + 2, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}