memmove -内存拷贝函数
void* memmove(void*destination ,const void* source,size_t num)
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
如果源空间和目标空间出现重叠,就得使用memmove函数来处理
源空间和目标空间的重叠有3种情况:
1.dest<src
src->dest 从前(相对于src来讲)向后拷贝
2.src<dest<src+count
src->dest 从后向前拷贝
3.src<dest
从前向后/从后向前 均可
那就规定从后向前
模拟实现memmove
void* my_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest<src)
{
//前->后
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
//后->前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
my_memmove(arr + 2, arr, 20);
for (i = 0; i < 10;i++)
{
printf("%d ", arr[i]);//1 2 1 2 3 4 5 8 9 10
}
return 0;
}