memcpy和memmove两个函数比较相似,但在使用的时候有些区别

memcpy的作用是,把源src所指的内存的地址的起始位置开始拷贝n个字节到目标dest
所指的把内存地址的起始位置中

实现代码如下:

void* my_memcpy(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}

这段代码看似没什么问题,但是出现以下这种情况的时候结果就会出错

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr + 1, arr, 20);return 0;
}

因为往同一块区域中拷贝的时候(arr)位置的内容会覆盖掉后面(arr+1)要拷贝的内容
所以,后面要拷贝的(arr+1)的内容是被(arr)覆盖掉的。

而memmove不会出现这种问题
实现代码如下:

void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);if (dest < src){while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}

因为,memmove可以从要拷贝的最后一个字节向前拷贝 所以不会造成覆盖。

两个函数各有优缺:

memcpy:代码比较简洁,运行时间比较少,在不会被覆盖的情况下编译起来比较快。
memmove:因为加入了判定,运行时间会比memmove慢,但是不容易出错。

有的编译器里两个函数实现代码一样

memcpy和memmove相关推荐

  1. strcpy,memcpy和memmove区别

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

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

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

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

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

  4. C和指针之字符串memcpy、memmove、memset使用总结

    1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...

  5. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

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

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

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

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

  8. C语言学习笔记---数据拷贝函数memcpy()和memmove()函数

      在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...

  9. memcpy、memmove、memcmp、memset函数的使用说明和模拟实现

    在前面的文章中,我已经对字符串函数进行了详细的介绍和模拟实现,今天,我来讲解另一类函数----------内存函数. 这里写目录标题 memcpy函数 memmove函数 memcmp函数 memse ...

  10. memcpy、memmove

    前言 一.memcpy 1.介绍 2.使用 3.模拟实现 二.memmove 1.介绍 2.模拟实现 三.总结 前言 上一文,学习了字符串相同函数的使用,在某些场合,数据的类型不限于字符串,有可能是整 ...

最新文章

  1. 20018-05-16 第十天
  2. KVM虚拟机源代码分析
  3. [Java]jdbc[转]
  4. Visual Studio Code之常备快捷键
  5. oracle树结构查询----connect by语法详解
  6. 华为程序员面试要改:网上编程 90 分钟,现场编程 30 分钟
  7. MYSQL的函数有哪些?(4.1时间与日期函数)
  8. 【BZOJ】1679: [Usaco2005 Jan]Moo Volume 牛的呼声(数学)
  9. 华为交换机不同网段互访_华为交换机实现不同VLAN之间互访
  10. 计算机语言的比较英文论文,科学网—撰写高质量英文科技论文的心态、布局、程序和方法 - 岳中琦的博文...
  11. 自我提高网站list
  12. cad插件_CAD插件自动编号安装教程
  13. SpringBoot实现本地、网络文件下载、zip压缩包批量下载
  14. idea 光标 快捷键_idea 快捷键汇总
  15. Leetcode-714. 买卖股票的最佳时机含手续费
  16. autocad2014 菜单栏 闪退_AutoCAD2014闪退解决办法
  17. linux系统读移动硬盘,在linux系统上识别与挂载移动硬盘数据
  18. VS Code 所选驱动器或UNC共享不存在或不可访问。请另外选择
  19. GitHub Copilot 被爆存在安全漏洞,涉及四成代码
  20. 基于python的图像处理的毕业论文_个人毕业设计基于python开发的图像论文34646.doc...

热门文章

  1. verdi方法fsdbreport将fsdb的某个信号值抽出为可读文件 及波形转换,合并,修改工具,Verdi培训整理笔记
  2. Android滑动冲突解决方法(二)
  3. 如何实现CAPP、CMainFrame、CViEW和CDOC之间相互调用?
  4. 当TD源链遇上音乐,会奏出怎样的乐章
  5. 浅浅时光,几许温暖,拥一份恬静安然、守住一颗宁静的心,不染悲伤。
  6. linux生成ext4镜像,制作ext4格式image镜像
  7. win10VS2019无法登录微软账号的问题
  8. 使用uiautomator做UI测试
  9. Linux实验3 服务与进程的管理实验报告(部分英文)
  10. 浅析transient关键字