memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count);

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。

二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。

memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了

memcpy()、 memmove()和memccpy()
-------------------------------------------------------
    这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
    对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。
原型:extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符ch则停止复制。
说明:返回指向字符ch后的第一个字符的指针,如果src前n个字节中不存在ch则返回NULL。ch被复制。
char s[]="Goldenx Global View";
char d[20];
char *p;
p=(char *)memccpy(d,s,'x',strlen(s));
if(p)
{
   *p='\0'; // MUST Do This
   printf("Char found: %s.\n",d);
}
else
   printf("Char not found.\n");

关于memmove的实现:

void *mymemmove(void *dest, const void *src, size_t n)
{char temp[n];int i;char *d = dest;const char *s = src;for (i = 0; i < n; i++)temp[i] = s[i];for (i = 0; i < n; i++)d[i] = temp[i];return dest;
}

关于memcpy的实现:

    void *mymemcpy(void *dest, const void *src, size_t n){char *d = dest;const char *s = src;int *di;const int *si;int r = n % 4;while (r--)*d++ = *s++;di = (int *)d;si = (const int*)s;n /= 4;while (n--)*di++ = *si++;return dest;}

注:两者皆为汇编实现,上面代码仅供方便理解两者区别,

本文转自 jiu~ 博客园博客,原文链接:http://www.cnblogs.com/jiu0821/p/7172172.html,如需转载请自行联系原作者

memmove 和 memcpy的区别相关推荐

  1. C/C++ memmove与memcpy的区别及实现

    1.与字符串函数strcpy区别: memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作. memcpy与memmove拷贝多少是通过其第三个参数进行控制 ...

  2. 手撕内存拷贝函数 memmove、memcpy

    做题家系列 -- 手撕内存拷贝函数 memmove.memcpy memcpy 函数原型 实现思路 手撕代码 面试注意要点 memmove 函数原型 实现思路 手撕代码 面试注意要点 总结 memcp ...

  3. memmove和memcpy区别

    memmove和memcpy区别 memcpy()和memmove()都是c语言的库函数(头文件保护#include <string.h>),作用是拷贝一定长度内存的内容.它们唯一的区别是 ...

  4. memmove和memcpy

    1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返回指向dest的void *指针 参 ...

  5. memmove, memcpy 的mem魔法

    1.如果是在相同的数据结构中,对原有的数据结构进行缩减或者交叉数据的复制,根据源码;memmove 是避免了内存交叉的复制 2.而memcpy 的使用 就不考虑复制时的内存交叉的问题 请看下面的代码就 ...

  6. c语言深入浅出(一)strcpy和memcpy的区别

    c语言深入浅出(一)strcpy和memcpy的区别 strcpy和memcpy都是c语言的库函数 strcpy:只用于字符串的复制,当碰到'\0'就停止了 memcpy:用于这个内存的拷贝,适用于结 ...

  7. memmove、memcpy和memccpy简介

    memmove.memcpy和memccpy三个函数都是内存的拷贝,从一个缓冲区拷贝到另一个缓冲区. memmove(void *dest,void*src,int count) memcpy(voi ...

  8. 关于memcpy和memmove两函数的区别

    http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...

  9. strcpy和memcpy的区别(转)

    转自:http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html strcpy和memcpy都是标准C库函数,它们有下面的特点. s ...

最新文章

  1. 爱情神话:庄妃用美色套牢洪承畴之谜
  2. STL初探——构造和析构的基本工具: construct()和destroy()
  3. 吉大18秋学期C语言作业二答案,吉大18秋《C语言程序设计》在线作业12参考
  4. Eclipse新建SpringBoot项目,application.properties配置中文乱码
  5. php笔记之表单验证
  6. C语言学习之求∑k(k=100)+∑K*k(k=50)+∑1/k(k=10)
  7. 用Python模拟浏览器操作
  8. 深度学习之基于卷积神经网络(VGG16)实现性别判别
  9. 单光子探测技术应用_我如何最终在光学/光子学应用程序中使用机器学习作为博士学位
  10. unity消息队列判断字符串相等有错误_Python3十大经典错误及解决办法
  11. pip临时使用国内下载源,提高下载的速度
  12. Android GPS 取经纬度
  13. java 中静态变量(类变量)与实例变量 静态方法与实例方法
  14. 微软紧急修复FIP-FS中的 “Year 2022” 漏洞
  15. Delphi中Format与FormatDateTime函数详解
  16. 更新更新,小白学面向对象方法,研一课程,附带补充C++知识
  17. 荐书丨《好奇心的秘密》:一个针尖上可以站多少跳舞的小天使?
  18. 字节跳动变更集团LOGO 此前已正式更名为抖音集团
  19. PHP连接数据库——身份验证问题
  20. 腾讯云服务器查看防火墙规则,腾讯云云防火墙的常见问题

热门文章

  1. linux nfs搭建
  2. 百度地图应用开发(一)
  3. 调整Win7资源管理器中导航栏和计算机的位置
  4. Vista下控件无法安装解决办法
  5. 小程序webview跳转页面后没有返回按钮完美解决方案
  6. 【2018.2.28】思考与练习
  7. c# 通过API启动外部程序
  8. 《Adobe Flash Professional CC经典教程》——1.3 使用“库”面板
  9. activiti源码编译
  10. Libgdx学习笔记:分享自己写的异步加载