memmove函数:
void *memmove(void *dest, const void *src, size_t count);
memmove函数和memcpy函数的作用区别主要在于cpy不能拷贝内存重叠的数据,而move考虑到了内存重叠时需要进行的操作。
当dest位置更高,并且两块数据重叠时,直接从左向右拷贝会导致已拷贝的数据覆盖掉还未拷贝的数据:
假如
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
MyMemcpy(arr1 + 2, arr1, 20);
//这里的拷贝是从低位向高位拷贝,并且内存空间重叠
如上图所示,在拷贝时红色为需要拷贝的数据,绿色为目标地址。
拷贝前两个数据之后,目标地址的数据会覆盖需要拷贝的数据,导致拷贝不到后面的内容,所以这种情况不能从前向后拷贝,必须从后向前拷贝。
src在内存中位置高于dest,数据应当从左向右拷贝
srt在内存种位置低于dest,数据应当从右向左拷贝
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void *MyMemmove(void *dest, const void *src, size_t count)
{
assert(dest != NULL);
assert(src != NULL);
void* pd = dest;
if (dest < src)
{
//src在内存中位置高于dest,则从左向右拷贝
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//srt在内存种位置低于dest,从右向左拷贝
while(count--)
{
*((char*)dest + count) = *((char*)src + count);
}
}
return pd;
}
int main()
{
int arr1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
MyMemmove(arr1 + 2, arr1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}