1.memmove
函數(shù)原型:void *memmove(void *dest, const void *source, size_t count)
返回值說明:返回指向dest的void *指針
參數(shù)說明:dest,source分別為目標(biāo)串和源串的首地址。count為要移動(dòng)的字符的個(gè)數(shù)
函數(shù)說明:memmove用于從source拷貝count個(gè)字符到dest,如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中。
2.memcpy
函數(shù)原型:void *memcpy(void *dest, const void *source, size_t count);
返回值說明:返回指向dest的void *指針
函數(shù)說明:memcpy功能和memmove相同,但是memcpy中dest和source中的區(qū)域不能重疊,否則會(huì)出現(xiàn)未知結(jié)果。
3.兩者區(qū)別
函數(shù)memcpy() 從source 指向的區(qū)域向dest指向的區(qū)域復(fù)制count個(gè)字符,如果兩數(shù)組重疊,不定義該函數(shù)的行為。
而memmove(),如果兩函數(shù)重疊,賦值仍正確進(jìn)行。
memcpy函數(shù)假設(shè)要復(fù)制的內(nèi)存區(qū)域不存在重疊,如果你能確保你進(jìn)行復(fù)制操作的的內(nèi)存區(qū)域沒有任何重疊,可以直接用memcpy;
如果你不能保證是否有重疊,為了確保復(fù)制的正確性,你必須用memmove。
memcpy的效率會(huì)比memmove高一些,如果還不明白的話可以看一些兩者的實(shí)現(xiàn):
void *memmove(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_source, *tmp_dest;
tmp_source = (char *)source;
tmp_dest = (char *)dest;
if((dest + count<source) || (source + count) <dest))
{// 如果沒有重疊區(qū)域
while(count--)
*tmp_dest++ = *tmp_source++;
}
else
{ //如果有重疊
tmp_source += count - 1;
tmp_dest += count - 1;
while(count--)
*--tmp_dest = *--tmp;
}
return dest;
}
void *memcpy(void *dest, const void *source, size_t count)
{
assert((NULL != dest) && (NULL != source));
char *tmp_dest = (char *)dest;
char *tmp_source = (char *)source;
while(count --)//不對(duì)是否存在重疊區(qū)域進(jìn)行判斷
*tmp_dest ++ = *tmp_source ++;
return dest;
}