memcpy及memmove函数详解
来源:互联网 发布:php extends 继承 编辑:程序博客网 时间:2024/06/15 23:31
•memcpy是把src指向的对象中的size个字符拷贝到dest所指向的对象中,返回指向结果对象的指针.
•memmove也是把src指向的对象中的size个字符拷贝到dest所指向的对象中,返回指向结果对象的指针,但这两个函数在处理内存区域重叠的方式不同.
注意memmove这个函数名称中有”move”这个单词,而实际上src处的数据仍然还在,并没有真的被”移动”了!这个函数名称有它的历史原因,是因为有了memcpy函数后,发现这个函数有问题,又发明了另一个没有问题的memcpy函数,但为了爆出兼容性依然保留了memcpy函数,而将新版本的memcpy函数改名为memmove函数.
内存重叠问题是指目的地址的内存空间的首地址,包含在源内存空间中,这两段内存空间有了交集,因而在使用memcpy进行内存复制操作时,这段重叠的内存空间会被破坏.这种情况在应用程序级代码中一般不会出现的,而在驱动或内核级代码中要十分小心,尽量使用memmove函数.
memcpy对内存空间有要求的,dest和src所指向的内存空间不能重叠,否则复制的数据是错误的.下面具体讲解一下这个错误是如何产生的.
如果内存空间布局入下图所示:
src所指向的内存空间后面部分数据被新拷贝的数据给覆盖了(也就是dest<=src+size).所以拷贝到最后,原来的数据肯定不是原来的数据,拷贝的数据也不是想要的数据,使用memcpy函数可以得到错误的结果.
再者,如果内存空间布局入下图所示:
虽然原来的数据不再是原来的数据(dest+size>=src),但拷贝的数据是原来的数据,使用memcpy函数可以得到正确的结果.因此,在使用memcpy这个函数之前,还需要做一个判断,如果dest<=src你才能使用这个函数不过完全没有必要,你直接使用memmove函数就可以了.memmove在拷贝之前就做了一个判断,如果dest <= src,就按照memcpy的思路拷贝,如果dest>src怎么办呢,看函数,它是从后面往前拷贝,这样就能正确拷贝数据了.根据上面的分析,理解下面的代码应该是一件很容易的事情.
下面附上源码:
void* memcpy(void* dest, const void* src, size_t len){ char *p1 = dest; const char *p2 = src; while(len--) { *p1++ = *p2++; } return dest;}
void* memmove(void* dest, const void* src, size_t len){ char *p1 = dest; const char *p2 = src; if(dest <= src) { while(len--) { *p1++ = *p2++; } } else { p1 += len; p2 += len; while(len--) { *p1-- = *p2--; } } return dest;}
- memcpy及memmove函数详解
- memmove,memcpy函数详解
- memcpy,memmove函数实现及区别
- memcpy,memccpy,memmove函数
- memcpy函数, strcpy(), memmove().
- memcpy,memccpy,memmove函数
- memcpy,memccpy,memmove函数
- memcpy 和 memmove 函数
- memmove和memcpy函数
- C语言函数memcpy(),memmove(),memcmp()用法详解
- memmove、memcpy和memccpy简介及函数的实现
- memmove、memcpy和mem**y简介及函数的实现
- memcpy、memmove、strcpy函数实现源码及区别
- strcpy,memcpy,memmove函数之间的区别及源码
- memmove和memcpy函数的区别及实现
- C语言 string及memcpy,memmove函数的模拟实现
- memcpy()函数与memmove()函数
- 实现memcpy和memmove函数
- EA&UML日拱一卒--类图::实现(realization)
- Jquery mobile 按钮图标
- 使用mysql索引技巧及注意事项
- (11)caffe总结之命令行解析
- 使用docker来提升你的Jenkins演示
- memcpy及memmove函数详解
- CCF NOI1019 分段函数
- h1532最大流
- 优化php性能的一点总结
- 相似三角形
- 最长回文字串——Manacher算法
- centos7 下配置安装JDK7
- spark安装部署
- BFS+预处理 POJ