memmove和memcpy的區別
阿新 • • 發佈:2018-11-23
memcpy和memmove都是C語言的庫函式,在標頭檔案string.h中,作用是記憶體拷貝,原型如下“
它們的作用都是記憶體拷貝,唯一的區別是,當記憶體發生區域性重疊時,memmove保證了拷貝的結果是正確的,但是memcopy不一定是正確的。但是memcpy比memmove速度快。
memcpy
memcpy函式從src記憶體中拷貝了count位元組到dest記憶體區域,但是src和dest的記憶體區域不能重疊。
memmove
memcpy函式從src記憶體中拷貝了count位元組到dest記憶體區域,但是src和dest的記憶體區域可以重疊。
memcpy和memmove對比:
記憶體重疊區域有兩種情況:
memcpy函式實現:
void *my_memcpy(void *dst,void *src,size_t n)
{
char *tmp = (char *)dst;
char *p = (char *)src;
while(n--)
{
*tmp++ = *p++;
}
return dst;
}
memcpy在第二種記憶體覆蓋情況下,最終不會得到正確的結果,會有踩記憶體現象,第一種記憶體覆蓋可以得到正確的結果。
memmove函式實現:
void *my_memmove(void *dst,void *src,size_t n) { char *p1 = (char *)dst; char *p2 = (char *)src; if(p1 > p2 && p2+n > p1)//對於第二種記憶體覆蓋進行了討論 { p1 = p1+n-1; p2 = p2+n-1; while(n--) { *p1-- = *p2--; } } else { while(n--) { *p1++ = *p2++; } } return dst; }
memmove針對第二種記憶體覆蓋進行了改進,所以memmove能正常工作。