memcpy函数是把src指向的对象中的size个字符拷贝到dst所指向的对象中,返回指向结果为对象的指针
1. 不考虑内存覆盖时,代码如下
void *memcpy(void * dst,const void *str,int n)
{
if(dst==NULL||str==NULL||n<=0) // 判断是否符合要求
{
return NULL;
}
char *pdst=(char *)dst;
char *pstr=(char *)str;
while(n--)
{
*pdst ++ = *pstr++;
}
return dst;
}
2.考虑内存覆盖问题
目的地址的内存空间的首地址可能会包含在源地址的内存空间中,因此这两段空间有了交集,因此再进行拷贝的时候,重叠的内存空间就会被破坏,因此需要进行判断。
画图如下所示:
因此得出代码如下:
//考虑被覆盖问题 dst和str所指向的内存空间不能重叠,
void *memcpy(void * dst,const void *str,int n)
{
if(dst==NULL||str==NULL||n<=0)
{
return NULL;
}
char *pdst=(char *)dst;
char *pstr=(char *)str;
if(pdst>pstr&&pdst<pstr+n)
{
pdst=pdst+n-1;
pstr=pstr+n-1;
while(n--)
{
*pdst -- = *pstr --;
}
}
else
{
while(n--)
{
*pdst ++ = *pstr++;
}
}
return pdst;
}