memcpy()不能处理内存重叠的情况,而memmove()可以,当有重叠时,进行倒序拷贝。
//memmove()
void* myMemMove(void* pDst, const void* pSrc, size_t cnt) {
assert(pDst != nullptr && pSrc != nullptr);
char* pd = (char*)pDst;
const char* ps = (const char*)pSrc;
//有重叠,则由高字节向低字节拷贝,即从后向前
if(pd >= ps && pd <= ps + cnt) {
pd = pd + cnt - 1;
ps = ps + cnt - 1;
while(cnt--)
*pd-- = *ps--;
}
//无重叠,低字节向高字节拷贝
else {
while(cnt--)
*pd++ = *ps++;
}
return pDst;
}
int main(){
char src[10] = "hellowo";
char dst[10];
myMemMove(dst, src, strlen(src)+1);
cout<<dst;
return 0;
}