0%

mem类函数模拟

模拟实现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;
}