在C/C++標準庫函數中存在該函數,它用於將src指向的n個字節的數據拷貝到dest位置。在標準庫函數中還存在另外一個函數memcpy,它也用來實現內存拷貝,但它不考慮區間重疊問題,在拷貝過程中可能造成重疊錯誤。
而memmove則針對上訴問題給出了一定的處理措施來防止拷貝出錯:
(1)當源內存的首地址等於目標內存的首地址時,不進行任何拷貝
(2)當源內存的首地址大於目標內存的首地址時,實行正向拷貝
(3)當源內存的首地址小於目標內存的首地址時,實行反向拷貝
下面給出memmove的具體實現,關於memcpy可參考庫函數實現或相關資料。
void *memmove(void *dest,const void *src, size_t n)
{
if (NULL == dest || src == NULL)
{
cerr<<"NULL pointers!";
return NULL;
}
int step;
char *p, *q;
if ((char *)src == (char *)dest) {
return dest;
} else if ((char *)src > (char *)dest) {
step = 1;
p = (char *)src;
q = (char *)dest;
} else {
step = -1;
p = (char *)src + n - 1;
q = (char *)dest + n - 1;
}
for(int i = 0; i != n; ++i) {
*q = *p;
p += step;
q += step;
}
return dest;
}