memcpy函数和memmove函数都是C语言的库函数,作用都是从一个空间copy一定长度的内容到另一个空间,不同的是memcpy只是单纯的拷贝,当两个空间发生局部重叠时无法保证拷贝的正确(正不正确取决于编译器),而memmove可以保证拷贝正确。

1、memcpy

memcpy函数在使用时包含以下头文件

#include <string.h>
//或
#include <cstring>

memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下:

 void* memcpy(void *dst,const void *src,size_t count){void* ret = dst;while (count--){*dst++=*src++;}return (ret);}

2、memmove

memmove函数在使用时需要用到以下头文件(和memcpy一样)

#include <string.h>
//或
#include <cstring>

memmove的原型是memmove(void *dst,void *src,int count),功能和memcpy几乎一样(不考虑空间重叠),其源码是

void *memmove(void *dest, const void *src, size_t count)
{void *ret = dest;if (dest == NULL || src == NULL)return;if (dest <= src || dest >= src + count){while (count--)*dest++ = *src++;}else{dest += count - 1;src += count - 1;while (count--)*dest-- = *src--;}return ret;
}

可以发现memmove函数的源代码比memcpy函数的代码多了一个判断:如果dest在src前面或dest和src是相同的,则拷贝方式和memcpy一样,是从前向后拷贝,但如果dest在src后面,若是还用从前向后拷贝的方法则会出现重叠,所以这时要采用从后向前拷贝的方法。

举个例子:

    char s[] = "12345";memcpy(s + 2, s, 3);printf("%s\n",s);

以上打印的结果应为:12121 (部分编译器为12123)

原理以下图解:

s指向“1”的地址,s+2指向“3”的地址,以上代码旨在把起点为s地址,长度为3的空间拷贝到s+2处。我们期望得到的是12123,但实际上并非如此。

最后结果为:

以上是memcpy函数从前向后拷贝的短板之处,故memcpy函数不能正确拷贝两个空间有重叠的地址。但同样的例子用memmove函数来解决的话就会出现另一个结果,以下是memmove函数从后向前拷贝的过程:

s指针会先移动到“3”的位置,此时s+2指向“5”的地址,然后将s地址上的“3”拷贝到s+2地址处:

然后指针向前移动进行下一处的拷贝:

最后将“1”覆盖到“3”的地址,最后结果如下:

总结:当需要拷贝的两处地址不存在空间重叠时,memcpy函数和memmove函数的功能是一样的,但存在空间重叠时,memcpy函数不保证正确拷贝(从前往后拷贝),而memmove函数可以正确拷贝(从后往前拷贝)。

C语言memcpy函数和memmove函数相关推荐

  1. 用C语言模拟实现memcpy函数,memmove函数

    一. memcpy函数 void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 将num字节的值从源指 ...

  2. memcpy函数与memmove函数

    1.1 memcpy函数是C语言内存拷贝函数,功能是从原内存地址的起始位置开始依次拷贝若干个字节到从目标地址的起始位置开始依次向后的若干个字节中. void* memcpy(void* dest,co ...

  3. 十一.字符串函数与内存函数

    目录 一.求字符串长度 二.长度不受限制的字符串函数 1.strcpy函数 2.strcat函数 3.strcmp函数 三.长度受限制的字符串函数 1.strncpy函数 2.strncat函数 3. ...

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

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

  5. 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat

    用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...

  6. C语言函数:内存函数memmove()以及实现与使用。

    C语言函数:内存函数memmove()以及实现与使用. memmove(): 头文件:#include <string.h> 函数参数:          可以发现memmove()函数的 ...

  7. 详解memcpy和memmove函数的使用

    作者:~小明学编程 文章专栏:C语言基础知识 格言:目之所及皆为回忆,心之所想皆为过往 目录 memcpy 什么是memcpy? memcpy与strcpy的区别 memcpy 模拟实现memcpy ...

  8. c语言memmove头文件,memmove函数

    写一个函数,完成内存之间的拷贝 void* mymemcpy( void *dest, const void *src, size_t count ) { char* pdest = static_c ...

  9. memcpy和memmove函数的区别

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

最新文章

  1. java集合的某项相加_java8实现list集合中按照某一个值相加求和,平均值等操作代码...
  2. 关于肉鸡的一些使用教程
  3. python asyncio_Python中asyncio神器的入门
  4. maven 多环境打包发布的两种方式
  5. CRC校验工具----CRC8校验 (x8+x2+x+1)
  6. C语言二叉排序树的中序遍历,C语言实现二叉树的中序线索化及遍历中序线索二叉树...
  7. Java 上传图片(Socket连接)
  8. iReport连接数据库
  9. html效果浮窗效果,jQuery简单实现中间浮窗效果
  10. ThinkAdmin漏洞(CVE-2020-25540 )复现
  11. 必记的13个不定积分公式(详细推导)
  12. win10电脑底下一排图标没了怎么办
  13. HTML5期末大作业:餐饮美食网站设计——上海美食介绍(6页) HTML+CSS+JavaScript HTML毕设网页设计 web学生网页设计作业源码
  14. 在中央电视台元旦晚会上倒数过新年
  15. 为什么我坚持一直使用AutoCAD 2007?(页末附CAD2007及天正单机版下载地址)
  16. 九阴白骨爪(3)Pycharm远程调试设置
  17. 小米路由搭建KMS Server
  18. 怎么保证ECU的“实时性”
  19. 狩猎装备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. item_get_app - 根据ID取商品详情原数据H5数据接口

热门文章

  1. win7进程权限管理
  2. jq框架刚开始用()()意思是什么
  3. 43.FFmpeg学习笔记 - flv格式解析
  4. 使用windbg挖地雷直接取胜
  5. 《花落的声音》(张爱玲作品)
  6. python:天天向上与三天打鱼两天晒网
  7. 神经网络研究主要内容,神经网络最新研究方向
  8. Android BlueTooth蓝牙使用
  9. Spark中CheckPoint、Cache、Persist的用法、区别
  10. 关于对广电网络的疑惑~