void* memcpy(void* dest, const void* src, size_t count) {
if (count == 0) return dest;
if (!dest || !src) return NULL;
if (dest == src) return dest;
char* d = (char*)dest;
const char* s = (const char*)src;
while (count--)
*d++ = *s++;
return dest;
}
關鍵點:
char* 按位元組操作dest 支援鏈式調用void* mymemcpy(void* dest, const void* src, size_t count) {
char* d = (char*)dest;
const char* s = (const char*)src;
int n = (count + 7) / 8; // 輪數(向上取整)
switch (count & 7) { // 餘數決定跳入位置
case 0: do { *d++ = *s++;
case 7: *d++ = *s++;
case 6: *d++ = *s++;
case 5: *d++ = *s++;
case 4: *d++ = *s++;
case 3: *d++ = *s++;
case 2: *d++ = *s++;
case 1: *d++ = *s++;
} while (--n > 0);
}
return dest;
}
count = 9 → n = 2、count & 7 = 1 → 跳入 case 1 執行 1 次,while 再跑 1 輪 8 次,共 9 次。const void* src — 防止誤修改源數據d/s 操作,不動原參數void* → char* 類型轉換正確dest == src 自拷貝destconst 正確性char* strcpy(char* strDest, const char* strSrc) {
assert(strDest && strSrc);
char* addr = strDest;
while ((*strDest++ = *strSrc++) != '\0');
return addr;
}
const char* strSrc 限定的是指向內容不可變,而非指針本身。函數內 strSrc++ 修改的是形參副本,不影響實參指向的字符串常量,安全合法。