天天看點

Memcpy 拷貝函數的實作(考慮記憶體覆寫問題)

memcpy函數是把src指向的對象中的size個字元拷貝到dst所指向的對象中,傳回指向結果為對象的指針

1. 不考慮記憶體覆寫時,代碼如下

void *memcpy(void * dst,const void *str,int n)
{
    if(dst==NULL||str==NULL||n<=0) // 判斷是否符合要求
    {
        return NULL;
    }
    char *pdst=(char *)dst;
    char *pstr=(char *)str;
    while(n--)
    {
        *pdst ++ = *pstr++;
    }
    return dst;
    
}      

2.考慮記憶體覆寫問題

目的位址的記憶體空間的首位址可能會包含在源位址的記憶體空間中,是以這兩段空間有了交集,是以再進行拷貝的時候,重疊的記憶體空間就會被破壞,是以需要進行判斷。

畫圖如下所示:

Memcpy 拷貝函數的實作(考慮記憶體覆寫問題)
//考慮被覆寫問題   dst和str所指向的記憶體空間不能重疊,
void *memcpy(void * dst,const void *str,int n)
{
        if(dst==NULL||str==NULL||n<=0)
    {
        return NULL;
    }
    char *pdst=(char *)dst;
    char *pstr=(char *)str;
    if(pdst>pstr&&pdst<pstr+n)
    {
        pdst=pdst+n-1;
        pstr=pstr+n-1;
        while(n--)
        {
            *pdst -- = *pstr --;
        }
    }
    else
    {
            while(n--)
           {
        *pdst ++ = *pstr++;
    }
    }
    return pdst;
}      

繼續閱讀