memmove 保證源與目標重疊時數據不損壞,採用逆向拷貝策略。
void *my_memmove(void *dst, const void *src, size_t n) {
assert(dst && src);
char *d = dst; const char *s = src;
if (d > s && d < s + n) { // 重疊且目標在源後
d += n; s += n;
while (n--) *--d = *--s; // 從尾部向頭部拷貝
} else {
while (n--) *d++ = *s++; // 正向拷貝
}
return dst;
}
int main() {
int a[10] = {1,2,3,4,5,6,7,8,9,10};
my_memmove(a+4, a+2, 5*sizeof(int)); // 將 3,4,5,6,7 複製到 5,6,7,8,9
for (int i=0;i<10;i++) printf("%d ", a[i]);
// 輸出: 1 2 3 4 3 4 5 6 7 10
return 0;
}