void *memcpy(void *dest, const void *src, size_t count);
count 位元組,不檢查重疊。void*,支援任意型別。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;
}
若 src 在 dest 區間內,正向複製會覆蓋未讀資料。
解法:從尾部向前複製。
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 區間內,必須逆向複製。