實現c中memcpy函式

bian_qing_quan11發表於2017-07-31

1、memcpy庫函式

memcpy函式在C語言中的<string.h>中,在C++的<cstring>中。

函式原型:void * memcpy(void * dest, void * src, size_t num);

功能:將指標src所指向的記憶體中的num個位元組拷貝到dest中去;

庫函式中的memcpy沒有考慮記憶體重疊的情況,因此他並不是安全的。


2、函式實現

根據上一篇部落格的介紹,指出了memcpy可能會出現“記憶體重疊”的問題。

沒有考慮記憶體重疊的memcpy函式

void *my_memcpy(void *dest, const void *src, size_t count) //沒有考慮記憶體重疊情況
{
    assert(dest != NULL && src != NULL);
    char *tmp = dest;
    const char *s = src;
 
    while (count--)
      *tmp++ = *s++;
    return dest;
}


改進,考慮記憶體重疊的情況

void * my_memcpy(void *dst,const void *src,unsigned int count)  
{  
     assert(dst != NULL);  
     assert(src != NULL);  
     void * ret = dst;  
     if (dst <= src || (char *)dst >= ((char *)src + count))//源地址和目的地址不重疊,低位元組向高位元組拷貝  
     {  
         while(count--)  
         {  
             *(char *)dst = *(char *)src;  
             dst = (char *)dst + 1;  
             src = (char *)src + 1;  
         }  
     }  
     else                       //源地址和目的地址重疊,高位元組向低位元組拷貝  
     {   
         dst = (char *)dst + count - 1;  
         src = (char *)src + count - 1;   
         while(count--)   
         {  
             *(char *)dst = *(char *)src;  
             dst = (char *)dst - 1;  
             src = (char *)src - 1;  
         }  
    }  
    return ret;  
} 

相關文章