memmove和memcpy函數的區別及實現

1、memmove()和memcpy()函數和strcpy()函數的區別;

(1)使用的類型不一樣,strcpy()函數只對字符串進行操做;memmove()和memcpy()函數對全部類型都適用,爲內存拷貝; 
(2)strcpy()以’\0’爲拷貝的結束條件;而memmove()和memcpy()函數則是以第三個參數num進行控制拷貝;java

2、函數說明:

1.memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝N個字節到目標dst所指的內存地址的起始位置中。 
2.memmove函數的功能同memcpy基本一致,可是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝函數

3、memmove()和memcpy()函數的區別和聯繫:

相同點: 兩個都是內存拷貝,對全部類型都適用; 
不一樣點: 
(1)memcpy()函數是從前日後拷貝;假入出現內存重疊的現象;拷貝結果可能出錯; 
(2)memmove()函數在memcpy()函數的基礎上加入了對內存重疊拷貝的處理;引入了倒序拷貝的方式處理內存重疊的某些狀況;保證拷貝的正確性;spa

綜上:在現實中使用memmove()函數會比較好一點;指針

4、各類拷貝狀況:

這裏寫圖片描述
上述三種狀況,memcpy能夠成功對前兩種進行拷貝,對第三種狀況進行拷貝時,因爲拷貝dst前兩個字節時覆蓋了src原來的內容,因此接下來的拷貝會出現錯誤。而memmove對第三種狀況進行拷貝時會從src的最後向前拷貝N個字節,避免了覆蓋原來內容的過程。code

5、模擬實現:

memcpy:

 
 
//模式實現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;
}

memmove:

//模擬實現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函數的區別及實現
相關文章
相關標籤/搜索