我们先上定义
编辑
作用:将 num 字节的值从source所指向的位置复制到destination所指向的内存块。
编辑
作用:将 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的内容,欢迎在评论区留言共同进步!!!