主要问题
memmove 主要是为了解决内存重叠问题。(内存重叠简单来说就是,以字符串为例,在进行字符串的复制的时候,在内存上可能会与自身发生重叠,进而导致无法达到预期效果)
如上图所示,在复制过程中,由于原字符串的后半段发生重叠,无法进行有效的复制。
解决思路
如上图所示的,复制的地址 在原字符串的首地址之前的话,进行正常的复制即可达到目标效果。
而复制的地址在原字符串的首地址之后得话 只要倒着赋值,就可以达到目标效果。
也就是,只需要进行复制地址与原字符串地址进行比较,即可。
代码演示
#include <stdio.h>
void *my_memmove(void* dst, const void* src, int size)
{
char* str_dst = (char*)dst;
const char* str_src = (const char*)src;
//1、后重叠、或者是不重叠右边的拷贝,选择倒着拷贝
//2、前重叠、或者是不重叠左边的拷贝,选择正着拷贝
if (str_src < str_dst)//判断复制的地址
{
for (int end = size - 1; end >=0; --end)
{
*(str_dst + end) = *(str_src + end);
//str_dst[end] = str_src[end];
}
}
else
{
for (int start = 0; start < size; ++start)
{
*(str_dst + start) = *(str_src + start);
//str_dst[start] = str_src[start];
}
}
return dst;//为了支持连续拷贝,如C拷到B,B再拷到A
}
int main()
{
char str[100] = "hello world";
my_memmove(str + 6, str, 12);//后重叠
printf("%s\n",str);
char s[100] = " hello world";
my_memmove(str, str + 6, 11);//前重叠
printf("%s\n",str);
return 0;
}
结果演示: