memmove 函数处理的源内存块和目标内存块是可以重叠的
在C语言标准中 memcpy 是不能处理重叠拷贝的
如果源空间和目标空间出现重叠,就得使用memmove函数
首先用 dest 表示目标内存块,src表示源内存块 count表示要拷贝的数量 单位是字节!
假设一个整型数组 里面装着几个数字元素 1,2,3,4,5,6,7,8
现在要将2,3,4,5 重叠拷贝到4,5,6,7的位置 ,其中2,3,4,5为源内存块 ,4,5,6,7为目标内存块
dest表示目的地,src表示源数据 count表示拷贝的字节数
dest<src 从前向后拷贝
dest>src && dest<src+count 从后向前拷贝
dest>src+count 从前向后,从后向前都可以拷贝,随便拷贝无影响!
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, void* src, size_t count)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
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 };
//将34567重叠拷贝到12345中
my_memmove(arr, arr + 2, 20);
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}