转载:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201322332592/
memcpy和memmove实现不同测试:
memcpy不考虑内存重合问题:
即src<dest&&dest<src+n,从前往后cpoy因为重合部分内容被修改,所以复制出来的内容不正确。
所以memcpy是正向copy n个字节的内容。
memmove考虑内存重合问题:
即src<dest&&dest<src+n,在这种情况下memmove会从后往前copy n个字节的内容。
测试代码及结果如下:
#include <string.h>
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
memcpy(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
test_memmove.cpp:
#include <stdio.h>
#include <string.h>
int main(int argc,char*argv[])
{
int i=0;
int a[10];
for(i=0;i<10;i++)
{
a[i]=i;
}
//memcpy(&a[4],a,6*sizeof(int));
memmove(&a[4],a,6*sizeof(int));
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
测试结果:
{
if(dest==NULL||src==NULL)
return NULL;
char *pdest=(char*)dest;
char *psrc=(char*)src;
if(pdest<psrc||pdest>psrc+n) //内存没有重合或重合(dest<src&&dest+n>src)不影响正向copy
while(n--)
{
*pdest=*psrc;
pdest=pdest+1;
psrc=psrc+1;
}
}
else //dest>src&&dest<src+n的情况,两段内存空间有重合,从后往前copy。
pdest=pdest+n-1;
psrc=psrc+n-1;
while(n--)
{
*pdest=*psrc;
pdest=pdest-1;
psrc=psrc-1;
}
}
return dest;
}