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) 填充。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 第一小於第二 (標準規定回傳差值,實作常簡化為符號)。原文 my_memset 使用 *(int*)str = set 錯誤:
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;
}