我们先上定义
作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。
作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。复制站的内容和使用中间缓冲区一样时,允许destination和source重叠。
memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
我们用图来解释:
先用memcpy
在复制的过程source会和destination的一部分重叠并且覆盖掉destination的内容
下面memmove
两个对比的看在abc(de)这里发生了重叠,memmove的作用就是防止将重叠的部分覆盖,在拷贝的时候还在拷贝原来位置上对应的内容,而memcpy直接将其覆盖并且拷贝。
接下来我们实现两个函数
实现memcpy
void* my_memcpy(void* dst, const void* src, size_t cont)
{
assert(dst);
assert(src);
void* ret = dst;
while (cont--)
{
*(char*)dst = (*(char*)src);
dst = ((char*)dst)++;
src = ((char*)src)++;
}
return ret;
}
这个是memcpy函数的结构
我们的思想是将每个比特位的内容都交换,这样可以做到对应num字节的内容交换,所以我们将dst和src强转为char*类型,这样每次我们可以选择一个比特位的内容进行操作交换,移动。(这里先要吧dst的首地址记录下来作为返回值)
实现memmove
void* my_memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + count))
{
while (count--) {
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else {
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--) {
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return(ret);
}
这个是memmove的结构
思想和memcpy一样,注意的是重叠内容的处理,我们分为两种情况;
1.没有重叠内容
这种情况为 dst <= src || (char*)dst >= ((char*)src + count) 这样两部分不会重叠
2.重叠情况
这时候我们只需要反过来,倒着拷贝就可以了(仔细想一下)
以上就是memcpy的memmove的内容,欢迎在评论区留言共同进步!!!