int memcmp(const void *buf1, const void *buf2, size_t count) {
const unsigned char *p1 = buf1, *p2 = buf2;
while (count--) {
if (*p1 != *p2) return *p1 - *p2;
p1++; p2++;
}
return 0;
}
關鍵:用 unsigned char 逐位元組比較,確保正負號正確。
void *memcpy(void *dest, const void *src, size_t count) {
void *ret = dest;
unsigned char *d = dest;
const unsigned char *s = src;
while (count--) *d++ = *s++;
return ret;
}
假設 src 與 dest 不重疊,單向複製即可。
void *memmove(void *dest, const void *src, size_t count) {
void *ret = dest;
unsigned char *d = dest;
const unsigned char *s = src;
if (d < s) {
// 低位址→高位址:正向複製
while (count--) *d++ = *s++;
} else if (d > s) {
// 重疊且 dest 在 src 後:逆向複製避免覆蓋
d += count; s += count;
while (count--) *--d = *--s;
}
return ret;
}
核心差異:memmove 檢測重疊並選擇複製方向,memcpy 不檢查,重疊時行為未定義。
void *memset(void *ptr, int value, size_t count) {
void *ret = ptr;
unsigned char *p = ptr;
unsigned char v = (unsigned char)value;
while (count--) *p++ = v;
return ret;
}
將 value 低 8 位填入每個位元組,常用於結構體/陣列歸零。
RtlMoveMemory、RtlFillMemory)size_t/uint64_t 為單位批量複製