1.与字符串函数strcpy区别:

  • memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
  • memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。

2.函数说明:

  1. memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
  2. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

3.代码实现

  1)memcpy

  

void* memcpy(void* memTo, void* memFrom, size_t size)
{  assert(memTo != NULL && memFrom != NULL);  char* temFrom = (char*)memFrom;  char* temTo = (char*)memTo;  while(size-- > 0)  *temTo++ = *temFrom++;  return memTo;
}  

  挺简单的,使用深复制

  2)memmove

void* memmove(void* dst,const void* src,size_t count)
{void* ret = dst;//dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容if (dst <= src || (char*)dst >= ((char*)src + count)){//从前往后复制,则不会出现覆盖src中没有复制的内容while(count--){*(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制dst = (char*)dst + 1; //移动一个字节src = (char*)src + 1;}}else{//从后往前复制,则不会出现覆盖src中没有复制的内容dst = (char*)dst + count - 1;//移动到末尾src = (char*)src + count - 1;while(count--){*(char*)dst = *(char*)src;dst = (char*)dst - 1; //移动一个字节src = (char*)src - 1;}}//返回dst的头指针,还方便左值操作。//如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);return ret;
}

代码中描述的就是以下两种情况

  

最后,memcpy在内存没有重复的情况下能够正确复制,若有重叠情况则复制结果错误,但是它的效率比memmove高。所以,在确定没有重复的情况下用memcpy,在不确定是否有内存重复的情况用memmove。

转载于:https://www.cnblogs.com/wangshaowei/p/8628478.html

C/C++ memmove与memcpy的区别及实现相关推荐

  1. memmove 和 memcpy的区别

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

  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. python输入与输出165
  3. Spark读取Hive中的数据加载为DataFrame
  4. 并发编程——线程——线程的理论和创建以及守护线程
  5. UVa 10188 - Automated Judge Script
  6. 2014 网选 上海赛区 hdu 5047 Sawtooth
  7. oracle11环境变量path设置_LUENT软件UDF环境变量配置
  8. 测试人员,今天再不懂BDD就晚了!
  9. math_Taylor_常见幂级数展开
  10. java资费管理模块_JAVA小区物业收费管理系统设计与实现.doc
  11. 如何在word中找到标准偏差σ、α、β、δ等数学公式符号和物理公式符号
  12. pagehelper版本升级导致pageSize为0时无法查询全部数据
  13. vue中detele删除对象属性时视图不能响应更新 - 解决办法
  14. 微信支付参数正确返回验签失败,建行微信服务商
  15. TextView中动态显示某些值
  16. 方差,协方差,标准差和均值标准差等各种差
  17. crt和zoc7的快捷键记录
  18. 计算机软件定时运行,做一回达人 Windows7定时运行程序
  19. word里双横线怎么打_word文档横线怎么打
  20. VM虚拟机-三种网络连接方式(桥接、NAT、仅主机模式)

热门文章

  1. AIX学习笔记-第一天简介
  2. 天天爱跑步——树上差分
  3. C# 大数组赋值给小数组,小数组赋值给大数组
  4. 报表控件NCreport教程:子查询系统设计
  5. jQuery 学习笔记 迭代jQuery对象和非jQuery对象
  6. awk 里面添加单引号
  7. Linux下的shell与make
  8. 由HEAP Corruption DETECTED查到的
  9. Python学习笔记之几点代码格式要求
  10. 代码里配置java代理