转载: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个字节的内容。
测试代码及结果如下:
test_memcpy.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)); 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; }
测试结果:
2、我们已经搞清楚了memcpy和memmove实现的不同,下面给出两个函数的实现: memcpy的实现: void *memcpy(void *dest,void *src,unsigned int n) { if(dest==NULL||src==NULL) return NULL; void *ret=dest; while(n>0) //不考虑内存重合问题,正向copy n个字节 { *(char*)dest=*(char*)src; dest=(char*)dest+1; src=(char*)src+1; n--; } } memmove的实现: void *memmove(void *dest,const void *src,unsigned int n) { 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; } strcpy拷贝字符串的实现: strcpy和memcpy的不同是strcpy只能操作字符串,遇到'\0'就结束,并且不考虑溢出问题。 char *strcpy(char *dest,char *src) { if(dest==NULL||src==NULL) return NULL; char *ret=dest; while((*src)!='\0') { *dest=*src; dest++; src++; } return dest; }