strcpy,memcpy,memmove的內存重疊

1、strcpy不考慮內存重疊函數原型如下:

char *strcpy(char *strDest, const char *strSrc){  
  
assert((strDest!=NULL) || (strSrc !=NULL));  
  
char *address = strDest;  
  
while( (*strDest++ = * strSrc++) != ‘\0’ ) ; 
  
return address ; 
} 


2、memcpy在不考慮內存重疊的情況可以寫成這樣:

void* memcpy(void *dest, void *src, size_t size)  
{  
    if(dest == nullptr || src == nullptr)  
        return nullptr;  
    void *result = dest;  
       
    while(size--)  
    {  
        *(char*)dest = *(char*)src;  
        dest = (char*)dest+1;  
        src = (char*)src+1;  
    }  
       
    return result;  
}  
內存重疊是指拷貝源地址與目標地址發生重合。重疊從兩方面考慮:
(1).dest數據覆蓋了source; 如:dest(8byte) 地址:1000
source(8byte) 地址:1002
(2).dest所指的區域本來就是source的一部分; 如:dest(8byte) 地址:1000
source(8byte) 地址:0998


3、所以,在考慮重疊的情況下,應類似memove,改變memcpy

void *memcpy(void *dest, void *src, size_t size)  
{  
    if(dest == nullptr || src == nullptr)  
        return nullptr;  
    void *result = dest;  
   
    if(dest < src || (char*)src+size < (char*)dest)//沒有內存重疊  
    {  
        while(size--)  
        {  
            *(char*)dest = *(char*)src;  
            dest = (char*)dest+1;  
            src = (char*)src+1;  
        }  
    }  
    else//有內存重疊  
    {  
        dest = (char*)dest+size-1;  
        src = (char*)src+size-1;  
        while(size--)  
        {  
            *(char*)dest = *(char*)src;  
            dest = (char*)dest-1;  
            src = (char*)src-1;  
        }  
    }  
    return result;  
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章