memcpy記憶體重疊問題

2021-07-16 06:13:37 字數 1436 閱讀 4549

之前一直沒有注意到記憶體複製函式的記憶體重疊問題。今天偶遇遂琢磨了一下,記之。

void *mymemcpy(void *dst,const

void *src,size_t num)

//assert((dst !=null) && (src!=null));

if(dst>=src+num||src>dst+num)

return dst;

}

void * mymemcpy(void *dst, const

void *src, size_t count)

} //pdest位址低於psrc位址,且有重疊

else

if(pdest < psrc && pdest > psrc-count)

} return dst;

}

1.memmove

函式原型:void *memmove(void *dest, const void *source, size_t count)

返回值說明:返回指向dest的void *指標

引數說明:dest,source分別為目標串和源串的首位址。count為要移動的字元的個數

函式說明:memmove用於從source拷貝count個字元到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中(此時源字串尾部字元改變)。

2.memcpy

函式原型:void *memcpy(void *dest, const void *source, size_t count);

返回值說明:返回指向dest的void *指標

函式說明:memcpy功能和memmove相同,但是memcpy中dest和source中的區域不能重疊,否則會出現未知結果。

3.兩者區別

函式memcpy() 從source 指向的區域向dest指向的區域複製count個字元,如果兩陣列重疊,不定義該函式的行為。

而memmove(),如果兩函式重疊,賦值仍正確進行。

memcpy函式假設要複製的記憶體區域不存在重疊,如果你能確保你進行複製操作的的記憶體區域沒有任何重疊,可以直接用memcpy;

如果你不能保證是否有重疊,為了確保複製的正確性,你必須用memmove。

memcpy的效率會比memmove高一些,兩者的實現:

void* memmove(void* dest, void* source, size_t count) 

else

return ret;

}void* memcpy(void* dest, void* source, size_t count)

對於字串拷貝函式,strcpy()也是存在記憶體重疊問題的。

memcpy和memmove記憶體重疊問題解析

區別 memcpy和memmove 都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下 cpp view plain copy print?void memcpy void dst,const void src,size t count void me...

memcpy記憶體重疊的解決

在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。memmove函式對記憶體重疊做了處理。現在來看函式strcpy 原型 extern char strcpy char dest...

memcpy記憶體重疊的解決

記憶體重疊 拷貝的目的位址在源位址範圍內。所謂記憶體重疊就是拷貝的目的位址和源位址有重疊。在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。memmove函式對記憶體重疊做了處理...