函数作用:用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域区域的字节拷贝到目标区域中,但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
memmove可以被分为三种情况:
1.dest<src,源内存的首地址大于目标内存的首地址,进行正向拷贝,此时无需担心dest+count>src,超出的部分只会将src已经拷贝过的部分覆盖,不会造成影响
2.dest>=src+count,此时目标内存的首地址大于源内存的首地址+count,进行反向拷贝,由于两首地址相距足够大,无需担心被覆盖问题
3.dest<src+count,此时目标内存的首地址小于源内存的首地址+count,此时随着src向dest拷贝,src前段会将末端的覆盖掉,导致数据丢失,此时我们需要手动“扩容”,将两个指针同时增加count-1
具体实现代码如下:
#include<stdio.h>
#include<stdlib.h>
void *my_memmove(void *dest, void *src, size_t count)
{
if (dest == NULL || src == NULL)
{
return NULL;
}
char*pdest = (char*)dest;
if (dest < src || (char*)dest >= (char*)src + count )
{
while (count--)
{
*(char *)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return pdest;
}
int main()
{
char src[] = "hello";
char dest[] = "hahha";
my_memmove(dest, src, strlen(src));
printf("%s", dest);
system("pause");
return 0;
}