首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言實現 memmove:處理內存重疊的安全拷貝

     編輯:關於C語言

memmove vs memcpy

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;
}

原理

  • 若目標地址在源地址之後且區間重疊,正向拷貝會覆蓋未讀取的源數據。
  • 逆向拷貝從最高地址開始,避免覆蓋源數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved