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

C語言記憶體複製函式:memcpy 與 memmove 手寫實作

     編輯:關於C語言

memcpy 原型

void *memcpy(void *dest, const void *src, size_t count);
  • 複製 count 位元組,不檢查重疊。
  • 參數/回傳均為 void*,支援任意型別。

memcpy 手寫實作

void *my_memcpy(void *dest, const void *src, int count) {
    char *d = (char*)dest;
    const char *s = (const char*)src;
    assert(dest && src);
    if (dest == src) return dest;
    while (count--) *d++ = *s++;
    return dest;
}

重疊問題與 memmove

若 src 在 dest 區間內,正向複製會覆蓋未讀資料。
解法:從尾部向前複製。

memmove 手寫實作

void *my_memmove(void *dest, const void *src, int size) {
    char *d = (char*)dest;
    const char *s = (const char*)src;
    assert(dest && src);
    if (s < d && d < s + size) {          // 重疊且 src 在前
        d += size; s += size;
        while (size--) *--d = *--s;       // 逆向複製
    } else {
        while (size--) *d++ = *s++;       // 正向複製
    }
    return dest;
}

關鍵判斷

s < d && d < s + size 表示 dest 起始位於 src 區間內,必須逆向複製。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved