memmove 保證重疊來源/目的區域正確複製,內部自動選擇複製方向。
#include#include void *my_memmove(void *dest, const void *src, size_t n) { assert(dest && src); char *d = (char *)dest; const char *s = (const char *)src; char *ret = d; if (d > s && d < s + n) { // 目的在來源後方且重疊 -> 從後向前複製 d += n; s += n; while (n--) *--d = *--s; } else { // 否則從前向後 (含不重疊、目的在前) while (n--) *d++ = *s++; } return ret; }
dest = dest + 16; src = src + 8; // 硬編碼偏移,完全錯誤! if ((src < dest) && (dest < src + count)) ...
dest/src 指針導致邏輯混亂、回傳值錯誤。int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
// 將前 5 個複製到索引 2 開始 (重疊)
my_memmove(arr+2, arr, 5*sizeof(int));
// 正確結果: 1 2 1 2 3 4 5 8 9 10
for (int i=0;i<10;i++) printf("%d ", arr[i]);
return 0;
}