模拟实现memcpy函数
主要注意内存踩踏的处理
memcopy
库函数自带的memcpy只需一个字节一个字节复制即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| void *mymemcpy(void *dest, const void *src, size_t count) { if ((dest == nullptr) || (src == nullptr)) { return nullptr; } void *res = dest; while (count--) { *(char *)dest = *(char *)src; dest = (char *)dest + 1; src = (char *)src + 1; } return res; }
|
解释一下几个指针的使用,第一次看到这种语法的时候也比较迷惑。
void *是类型未定的指针,算是一种泛型,复制时用char *指针将每个字节复制。
memmove
当有内存重叠的情况发生时,memcopy不能正确完成拷贝,而memmove可以正确处理。
从后往前拷贝即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void *mymemmove(void *dest, const void *src, size_t count) { if ((dest == nullptr) || (src == nullptr)) { return nullptr; } void *res = dest; if (dest < src) { while (count--) { *(char *)dest = *(char *)src; dest = (char *)dest + 1; src = (char *)src + 1; } } else { while (count--) { *((char *)dest + count) = *((char *)src + count); } } return res; }
|
memset
除此外还有memset填充和memcmp比较函数,与memcpy类似实现即可
1 2 3 4 5 6 7 8 9 10
| void *mymemset(void *dest, int val, size_t count) { assert(dest); void *res = dest; while (count--) { *(char *)dest = val; dest = (char *)dest + 1; } return res; }
|
memcmp
char*是有符号的,如果大于127即0x7F的数就是负数了,需要注意。
1 2 3 4 5 6 7 8 9 10 11
| int mymemcpy(const void *str1, const void *str2, size_t count) { assert(str1); assert(str2);
while (count-- && *(char *)str1 == *(char *)str2) { str1 = (char *)str1 + 1; str2 = (char *)str2 + 1; } return *(unsigned char *)str1 - *(unsigned char *)str2; }
|