memmove 和 memcopy

1.memmove

函数原型:void *memmove(void *dest, const void *source, size_t count)

返回值说明:返回指向dest的void *指针

参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数

函数说明:memmove用于从source拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

2.memcpy

函数原型:void *memcpy(void *dest, const void *source, size_t count);

返回值说明:返回指向dest的void *指针

函数说明:memcpy功能和memmove相同,但是memcpy中dest和source中的区域不能重叠,否则会出现未知结果。

3.两者区别

函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为。  
  而memmove(),如果两函数重叠,赋值仍正确进行。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy;  
  如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove。

memcpy的效率会比memmove高一些,如果还不明白的话可以看一些两者的实现:

void *memmove(void *dest, const void *source, size_t count)
{
 assert((NULL != dest) && (NULL != source));
 char *tmp_source, *tmp_dest;
 tmp_source = (char *)source;
 tmp_dest = (char *)dest;
 if((dest + count<source) || (source + count) <dest))
 {// 如果没有重叠区域
   while(count--)
     *tmp_dest++ = *tmp_source++;
}
else
{ //如果有重叠
 tmp_source += count - 1;
 tmp_dest += count - 1;
 while(count--)
   *--tmp_dest = *--tmp;
}
return dest;
}

void *memcpy(void *dest, const void *source, size_t count)
{
 assert((NULL != dest) && (NULL != source));
 char *tmp_dest = (char *)dest;
 char *tmp_source = (char *)source;
 while(count --)//不对是否存在重叠区域进行判断
   *tmp_dest ++ = *tmp_source ++;
 return dest;

}

转自:http://www.cppblog.com/colorful/archive/2012/04/23/172483.aspx

memcpy与memmove的区别相关推荐

  1. memcpy和memmove的区别以及内存重叠问题

    memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...

  2. memcpy和memmove的区别

    memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下:   void *memcpy(void *dst, const void *src, size_ ...

  3. 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数

    一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...

  4. memcpy and memmove

    12.25 memcpy() 和 memmove() 有什么区别? 如果源和目的参数有重叠, memmove() 提供有保证的行为.而 memcpy()  则不能提供这样的保证, 因此可以实现得更加有 ...

  5. strcpy,memcpy和memmove区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...

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

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

  7. memcpy和memmove函数的区别

    文章目录 前言 memcpy函数 memmove函数 memcmp函数 前言 c语言<string.h>库里面有很多的字符函数,比如memcpy,memmove,memcmp等,这些函数是 ...

  8. memcpy 头文件_C|memcpy()和memmove()的比较及实现

    memcpy()和memmove()函数的原型如下: void * memcpy ( void * dst, const void * src, size_t num ); void * memmov ...

  9. (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.内存函数是什么 二.内存函数的分类(常见) 1.memcpy memcpy的模拟实现 2.memmove memmov ...

最新文章

  1. 吴恩达:AI未来将呈现四大发展趋势
  2. 页面样式乱了,但是又感觉各种js,css都引入了
  3. Gut:人体最初的微生物起源与生殖健康
  4. shell 基本使用
  5. java圆角矩形_如何在java中使用普通矩形轮廓绘制圆角矩形
  6. 02 面向对象之:类空间问题以及类之间的关系
  7. 具有只读属性的ComboBox
  8. leetcode851. 喧闹和富有(dfs)
  9. 【Python基础知识-pycharm版】第六节-控制语句
  10. Flutter高级第3篇:底部 Tab 切换保持页面状态的几种方法
  11. 微信小程序开发入门与实践
  12. 【C/C++】C++基本语法
  13. (测试可用)针式打印机打印WEB页面字体不清晰,解决方法
  14. 串口和TCP测试工具
  15. 企业IT架构的发展历程
  16. Linux指令——tailf
  17. 进击ReactNative-疾如风
  18. Unity 给代码添加命名空间
  19. JVM性能调优(一)(JVM参数详解、内存分析等)
  20. 往事不回头,今后不将就~~Fighting

热门文章

  1. Linux shell基础(四)正则表达式与grep命令 beta
  2. mysql_connect() 不支持 请检查 mysql 模块是否正确加载 解决方法
  3. PHP获取汉字首字母并分组排序
  4. python临时笔记
  5. 翻译:理解TCP/IP网络栈编写网络应用(上)
  6. DELPHI存储过程调用
  7. Ubuntu 通过apt安装VSCode
  8. rendering omni shadow in one pass.
  9. [置顶] 杂七杂八
  10. 字符集编码转换--MFC