memmove函数的作用:
memmove函数的作用与memcpy的作用相似
都是将内存复制到另一个区域
但是他们的区别在于memmove函数可以进行同内存复制,但是memcpy函数不可以(在vs环境下也可以)
我绘制了以下图片理解:
我们设置了arr1后两个地址并选中了5个数字,使他在同内存中进行复制
但是要怎么实现呢
#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现memmove
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_memmove(void* dest, void* src, size_t num)
{
assert(dest);
assert(src);
void* ret = dest;//提供一个初始地址
if (src < dest)
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);//后——>前
}
}
else
{
while (num--)
{
*(char*)dest = *(char*)src;//前——>后
((char*)dest)++;
((char*)src)++;
}
}
return ret;
}
int main()
{
int arr[] = { 0 };
int arr1[] = { 1,2,3,4,5,6,7,8 };
my_memmove(arr1 + 2, arr1, 20);
for (int i = 0; i < 8; i++)
{
printf("%d", arr1[i]);
}
return 0;
}
我们要把src复制到dest中,当src和dest是同一块区域时,要判断哪个位置在前哪个在后;
具体可以分为两种情况
1.dest<src
此时直接从前往后复制不会出现问题
2.dest>src
此时从前往后复制会直接导致src之后的内存遭到改变,因此应该从后向前进行复制