一.menmmove函数原型及其功能
原型:
void* memmove(void* dest,const void* src,size_t size)
//size的单位:字节
功能:
从src的位置开始,向后拷贝size个字节的数据到dest的位置。功能与memcpy相同,但有以下几点这注意:
1.memmove与memcpy不同之处在于,memmove处理的源内存块和目标内存块是可以重叠的;
2.若出现源空间与目标空间重叠的情况,要使用memmove函数进行处理。
二.源与目标内存位置的图解
三.实现时值得注意的点
若出现上述图解的第二种情况,则需要在是实现时将拷贝的顺序变为从后向前拷贝,以避免出现前边拷贝的内容被后边拷贝的内容覆盖,导致代码运行结果达不到预期。
四.模拟实现
void* my_memmove(void* dest,const void* src,size_t size)
{
assert(dest&&src);
char* ret=(char*)dest;//用于保存目标内存的起始位置
//考虑可能出现的内存重叠的情况,并对其进行处理
if(src <= dest || ((char*)src+size >= (char*)dest))
{
char* p1=(char*)dest;
char* p2=(char*)src;
//此处不能用--,不然会出现少拷贝一个字节的情况,原因:参照--操作的的特点
while(size)
{
*(p1 + size - 1)=*(p2 + size - 1);
//从后向前拷贝
size--;
}
}
//其他便与memcpy一样,处理内存不重叠的情况
else
{
while(size)
{
(char*)dest=(char*)src;
dest=(char*)dest+1;
src=(char*)src+1;
size--;
}
}
return (ret);
}
测试结果
int main()
{
char str1[] = "asdfg";
char str2[]="zxcvb";
my_memmove(str1+1,str1, 2);
memmove(str2+1,str2,2);
puts(str1);
puts("\n");
puts(str2);
system("pause");
return 0;
}
测试截图