(1)使用的類型不一樣,strcpy()函數只對字符串進行操做;memmove()和memcpy()函數對全部類型都適用,爲內存拷貝;
(2)strcpy()以’\0’爲拷貝的結束條件;而memmove()和memcpy()函數則是以第三個參數num進行控制拷貝;java
1.memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝N個字節到目標dst所指的內存地址的起始位置中。
2.memmove函數的功能同memcpy基本一致,可是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝函數
相同點: 兩個都是內存拷貝,對全部類型都適用;
不一樣點:
(1)memcpy()函數是從前日後拷貝;假入出現內存重疊的現象;拷貝結果可能出錯;
(2)memmove()函數在memcpy()函數的基礎上加入了對內存重疊拷貝的處理;引入了倒序拷貝的方式處理內存重疊的某些狀況;保證拷貝的正確性;spa
綜上:在現實中使用memmove()函數會比較好一點;指針
上述三種狀況,memcpy能夠成功對前兩種進行拷貝,對第三種狀況進行拷貝時,因爲拷貝dst前兩個字節時覆蓋了src原來的內容,因此接下來的拷貝會出現錯誤。而memmove對第三種狀況進行拷貝時會從src的最後向前拷貝N個字節,避免了覆蓋原來內容的過程。code
//模式實現memcpy(不會解決內存重疊的問題,正序拷貝,適用於任何類型)
void* MyMemcpy(void* dest,const void* src,size_t num) { char* dest_tmp=(char*)dest;//目標字符串 const char* src_tmp=(const char*)src;//源字符串 assert(dest&&src); while(num--) { *dest_tmp++= *src_tmp++; } return dest; }
//模擬實現memove(會解決內存重疊的問題,加上了逆序拷貝,適用於任何類型) void* MyMemmove(void* dest,const void* src,size_t num) { char* dest_tmp=(char*)dest; const char* src_tmp=(const char*)src; assert(dest&&src); if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//狀況2和狀況1 { while(num--)//正序複製 { *dest_tmp++=*src_tmp++; } } else//狀況3,逆序賦值 { //調整指針到最後 dest_tmp+=num-1; src_tmp+=num-1; while(num--) { *dest_tmp--=*src_tmp--; } } return dest; }
轉自:memmove和memcpy函數的區別及實現