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

C語言手寫標準庫:memset 與 memcmp 實作詳解

     編輯:關於C

memset 實作:記憶體填充

void *my_memset(void *ptr, int value, size_t num) {
    unsigned char *p = (unsigned char *)ptr; // 逐 byte 操作
    while (num--) *p++ = (unsigned char)value;
    return ptr;
}

關鍵點:

  • 參數 value 為 int,但實際只取低 8 位 (unsigned char) 填充。
  • 回傳原指針,支援鏈式呼叫。
  • 標準庫常用字長優化 (一次寫 4/8 bytes),教學版逐 byte 即可。

memcmp 實作:記憶體比較

int my_memcmp(const void *ptr1, const void *ptr2, size_t num) {
    const unsigned char *p1 = (const unsigned char *)ptr1;
    const unsigned char *p2 = (const unsigned char *)ptr2;
    while (num--) {
        if (*p1 != *p2)
            return *p1 > *p2 ? 1 : -1; // 回傳差值正負,非單純 1/-1
        p1++; p2++;
    }
    return 0;
}

關鍵點:

  • 以 unsigned char 比較,避免 signed char 負值導致邏輯錯誤 (如 \xFF > \x01 作為 unsigned 為真,signed 為假)。
  • 回傳 0 相等,>0 第一大於第二,<0 第一小於第二 (標準規定回傳差值,實作常簡化為符號)。
  • 提前結束:首個不同 byte 即返回,效率高。

常見錯誤修正

原文 my_memset 使用 *(int*)str = set 錯誤:

  • 寫入 4 bytes 而非 1 byte,導致越界、填充錯誤值。
  • str = (int*)str + 1 步進 4 bytes,與 count-- (byte 計數) 不匹配。

原文 my_memcmp 邏輯正確,但未處理 const 正確性。

測試主程式

int main() {
    char buf1[20], buf2[20];
    my_memset(buf1, 'A', 10); buf1[10] = '\0';
    my_memset(buf2, 'A', 10); buf2[10] = '\0';
    printf("memcmp equal: %d\n", my_memcmp(buf1, buf2, 10)); // 0
    
    buf2[5] = 'B';
    printf("memcmp diff: %d\n", my_memcmp(buf1, buf2, 10));  // <0
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved