memcpy和memmove的区别
memcpy实现:
char *memcpy(void *s1, const void * s2, size_t n) { char *su1; const char *su2; for(su1=s1,su2=s2; 0<n; ++su1, ++su2, --n) *su1=*su2; return s1; }
memcpy可能造成因内存区域重叠造成的复制错误,但是它的执行速度很快,适用于已确定源和目标不会重叠的情况。
memmove实现:
void * memmove( void *s1, const void *s2, size_t n) { char * sc1; const char * sc2; sc1=s1; sc2=s2; if( sc2< sc1 && sc1< sc2 +n) for(sc1 +=n,sc2+=n; 0<n ;--n) *--sc1=*--sc2; else for(; 0<n; --n) *sc1++=*sc2++; return sc1; }
memmove的三种情况处理:
1.当源字符串的起始地址比目标地址高时,不会造成内存重叠出现的复制错误(但是可能会造成源字符串的破坏),此时使用正向复制;
2.当源字符串的起始地址比目标地址低,且复制后二者没有重叠时(sc1<sc2+n),也不会造成错误,使用正向复制;
3.当源字符串的起始地址比目标地址高,而复制后二者区域有重叠,则正向复制将造成错误,使用逆向复制。
因为memmove对复制的处理进行了判断,所以它的效率低于memcpy,但是增加了安全性。