strcpy, mencpy, memmove三者区别
首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点:
1.判断指针的有效性
2.将复制后的指针地址返回,为了支持链式操作
3.不要忘记将字符串最后一个自负'\0'复制给dest
4.注意原字符串类型为const,保证在函数内部不会被修改
char* myStrcpy(char* dest, const char* src){ assert(dest!=NULL && src !=NULL); char* r = dest; while((*dest++ = *src++)!='\0') ; return r; }
然后来看memcpy,目的是实现内存的复制,这里就不仅仅限制于字符串复制,并且规定了复制内存的大小
void* myMemcpy(void* dest, const void* src, size_t n){ assert(dest!=NULL && src !=NULL); void* r = dest; while(n--){ *dest++ = *src++; } return r; }
最后来看memmove,实现的功能,与mencpy是一样的,不同的地方在于,其处理了目的内存与原内存重叠的情况。
void* myMemmove(void* dest, const void* src, size_t n){ assert(dest!=NULL&& src!=NULL); void* r = dest; if(dest<src || dest>str+n){ //no recover while(n--){ *dest++ = *src++; } }else{ // with recover, copy from end to begin dest = dest+n; src = src + n; while(n--){ *(--dest) = *(--src); } } return r; }
总体看来,strcpy, memcpy和memmove都是对内存进行复制操作的,不同之处在于,strcpy强调对于字符串的处理,memcpy要给定复制内容的大小,memmove则注意了内存重叠的情况