memmove()函数:复制内存内容(优点:可以处理重叠的内存块)
2017-03-03 22:04
253 查看
一、简要解释
头文件:#include <string.h>
memmove() 用来复制内存内容,其原型为:
memmove() 与 memcpy() 类似都是用来复制 src 所指的内存内容前 num 个字节到 dest 所指的地址上。不同的是,memmove() 更为灵活,当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。
更多介绍请参考 memcpy(),下面给出一个示例:
运行结果:
memmove can be very very useful.
这段代码能够很好的说明内存重叠时的情况:先将内容复制到类似缓冲区的地方,再用缓冲区中的内容覆盖 dest 指向的内存,请看下图。
二、实现方式
下面是一种实现方式:
实现原理解释:
黑色曲线表示错误的拷贝方式,红色的曲线表示正确的拷贝方式。
黑色方块表示的是二者内存覆盖的区域
头文件:#include <string.h>
memmove() 用来复制内存内容,其原型为:
void * memmove(void *dest, const void *src, size_t num);
memmove() 与 memcpy() 类似都是用来复制 src 所指的内存内容前 num 个字节到 dest 所指的地址上。不同的是,memmove() 更为灵活,当src 和 dest 所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。
更多介绍请参考 memcpy(),下面给出一个示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main () { char str[] = "memmove can be very useful......"; memmove (str+20,str+15,11); puts (str); system("pause"); return 0; }
运行结果:
memmove can be very very useful.
这段代码能够很好的说明内存重叠时的情况:先将内容复制到类似缓冲区的地方,再用缓冲区中的内容覆盖 dest 指向的内存,请看下图。
二、实现方式
下面是一种实现方式:
#include <iostream> using namespace std; void* memmove(void* str1,const void* str2,size_t n) { char* pStr1= (char*) str1; const char* pStr2=(const char*)str2; if (pStr1 < pStr2) { for(size_t i=0;i!=n;++i){ *(pStr1++)=*(pStr2++); } } else{ pStr1+=n-1; pStr2+=n-1; for(size_t i=0;i!=n;++i){ *(pStr1--)=*(pStr2--); } } return str1; }
实现原理解释:
黑色曲线表示错误的拷贝方式,红色的曲线表示正确的拷贝方式。
黑色方块表示的是二者内存覆盖的区域
相关文章推荐
- C++实现内存复制函数(memmove解决内存重叠)
- memmove 和 memcpy的区别以及处理内存重叠问题
- memmove 和 memcpy的区别以及处理内存重叠问题
- 浅析memmove函数之内存重叠
- 生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理
- memmove 和 memcpy的区别以及处理内存重叠问题
- memmove 和 memcpy的区别以及处理内存重叠问题
- [置顶] 实现内存的移动,功能类似于memmove,可以不实现内存重叠拷贝,不使用任何库函数
- memmove函数与内存重叠
- memmove处理内存重叠的情况
- memmove 和 memcpy的区别以及处理内存重叠问题
- memmove函数如何考虑内存重叠的
- 请编写实现malloc()内存分配函数功能一样的代码。给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
- 《c primer pius》第十章第6题,编写一个程序,初始化一个二维double数组,并利用练习2中的任一函数来把这个数组复制到另一个二维数组(因为二维数组是数组的数组,所以可以使用处理一维数组的
- 避免内存重叠的memmove()函数
- 2.C语言实现函数void *memmove(void *dest, const void *src, size_t n)。memmove 函数的功能是拷贝src所指的内存内容前n个字节到dest所指
- memmove 和 memcpy的区别以及处理内存重叠问题
- 自己写的递归方法复制文件夹里面的内容(从源文件(里面可以有多个层次的子文件夹)到一个文件夹)
- memmove() -- 拷贝内存内容
- 【C语言】 字符串的内存拷贝处理函数