一.my_memcopy函数
#include<stdio.h>
void* my_memcopy(void* str1,const void* str2,int count)
{
char* my_str1 = (char*)str1;
char* my_str2 = (char*)str2;
if(str1 == NULL)
return ;
if(str2 == NULL)
return ;
while(count--)
{
*my_str1++ = *my_str2++;
}
return str1;
}
内存区域覆盖分为两种情况:
第一种情况如下:
.
在此情况下,虽然有内存覆盖,但是用memcopy进行复制可以得到正确结果。
第二种情况如下:
在此种情况下,若用memcopy进行拷贝,则会出现错误的结果即:最后两个字节的拷贝值已经不是原来的值了,而变成了str2的前两位
二、my_memmove
#include<stdio.h>
void* my_memmove(void* str1,const void* str2,int count)
{
char* mstr1 = (char*)str1;
char* mstr2 = (char*)str2;
if(str1 == NULL)
return ;
if(str2 == NULL)
return ;
if((mstr2 < mstr1)&&(mstr2+count) > mstr1)
{
mstr1 = mstr1 + count-1;
mstr2 = mstr2 + count-1;------此部分专门解决了覆盖的第二种情况,保证了拷贝能够正确进行
while(count --)
{
*mstr1-- = *mstr2--
}
}else
{
*mstr1++ = *mstr2++
}
return str1;
}
注:通过以上分析,则在有内存覆盖的情况下,最好使用memmove函数。