memmove和memcpy函数的区别及实现

2023-05-16

一、memmove()和memcpy()函数和strcpy()函数的区别;

(1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝; 
(2)strcpy()以’\0’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;

二、函数说明:

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

三、memmove()和memcpy()函数的区别和联系:

相同点: 两个都是内存拷贝,对所有类型都适用; 
不同点: 
(1)memcpy()函数是从前往后拷贝;假入出现内存重叠的现象;拷贝结果可能出错; 
(2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些情况;保证拷贝的正确性;

综上:在现实中使用memmove()函数会比较好一点;

四、各种拷贝情况:

这里写图片描述
上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

五、模拟实现:

memcpy:


  
//模式实现memcpy(不会解决内存重叠的问题,正序拷贝,适用于任何类型)

void* MyMemcpy(void* dest,const void* src,size_t num)
{
     char* dest_tmp=(char*)dest;//目标字符串
     const char* src_tmp=(const char*)src;//源字符串
     assert(dest&&src);
     while(num--)
     {
         *dest_tmp++= *src_tmp++;
     }
     return dest;
}  

memmove:


//模拟实现memove(会解决内存重叠的问题,加上了逆序拷贝,适用于任何类型)
void* MyMemmove(void* dest,const void* src,size_t num)
{
    char* dest_tmp=(char*)dest;
    const char* src_tmp=(const char*)src;
    assert(dest&&src);
    if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//情况2和情况1
    {
        while(num--)//正序复制
        {
            *dest_tmp++=*src_tmp++;
        }
    }
    else//情况3,逆序赋值
    {
        //调整指针到最后
        dest_tmp+=num-1;
        src_tmp+=num-1;
        while(num--)
        {
            *dest_tmp--=*src_tmp--;
        }
    }
    return dest;
}  

 





转自:memmove和memcpy函数的区别及实现

转载于:https://www.cnblogs.com/BinBinStory/p/8000888.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

memmove和memcpy函数的区别及实现 的相关文章

随机推荐

  • Ubuntu11.04无线网络已禁用或设备未就绪

    以前在Win7下安装Ubuntu的时候 xff0c Ubuntu能够正常的连接到无线网 xff0c 但是在新买的笔记本上安装完Ubuntu11 04后 xff0c 出现了无线网络已经禁用的情况 xff0c 起初我以为是无线网络开关未开启 x
  • 第11章 远程联机服务器SSH/XDMCP/VNC/RDP

    1 用例 远程联机服务器 xff0c 提供用户远程透过文字或图形接口登入系统 2 静态 2 1 sshd 该服务提供远程联机 xff0c 并且数据加密 查看是否启动命令 service sshd start 设置系统启动是开启sshd服务命
  • ubuntu下找不到openssl/ssl.h

    编译代码 xff0c 总提示找不到openssl ssl h文件 xff0c 怀疑没有安装ssl 于是 sudo apt get install openssl 之后再编译 xff0c 还是提示同样的问题 于是查找 usr local in
  • 基于Docker的RStudio-server构建

    docker rstudio server Dockerfile for RStudio Server Docker image Pull the image from Docker Hub span class token functio
  • 回收站的路径 (CentOS6、Fedora10)

    刚开始装Linux系统的时候在root用户下向其他用户拷贝过一些文件 xff0c 后面就删除了 但在普通用户下 xff0c 没有删除的权限 xff0c 想修改权限后删除又找不到回收站的路径 xff08 刚开始还不知道搜索回收站的路径 xff
  • dmPython

    dmPython 达梦为适配 python 开发出 dmPython 接口 xff0c 在使用时还需要需要配置 DPI 运行环境 1 连接方式 dmPython提供两种连接方式 xff0c 不仅支持 key 61 value 形式传参连接
  • iOS 手动实现KVO / iOS KVO底层原理

    手动实现KVO KVO底层原理 git demo地址 看图 首先说一下Apple KVO的底层实现吧 内部实现原理 KVO是基于runtime机制实现的 xff0c 运用了一个isa swizzling技术 isa swizzling就是类
  • Flutter系列 - 引入本地图片

    Flutter系列 引入本地图片 1 大致文件结构 images myIcon png myIcon2 png lib pubspec yaml 2 步骤 在flutter中引入本地图片 我们先在项目根目录建立一个images文件夹 把本地
  • 如何写出优美的 C 代码 面向对象的 C

    基础知识 结构体 除了提供基本数据类型外 xff0c C 语言还提供给用户自己定制数据类型的能力 xff0c 那就是结构体 xff0c 在 C 语言中 xff0c 你可以用结构体来表示任何实体 结构体正是面向对象语言中的类的概念的雏形 xf
  • Flutter系列 --- Flutter与原生进行通信交互

    Flutter系列 Flutter与原生进行通信 项目git地址 demo地址 flutter无法直接调用系统相机 麦克风 定位 手机版本信息等 xff0c 此时就需要与原生方法进行交互了 需求 目前我们已经有了一个flutter项目 工程
  • antd Tab切换后子组件重复渲染

    antd Tab切换后子组件重复渲染 当切换到历史订单的时候 MyComponent被渲染了两次 内部的componentDidMount被执行了两次 原因是TabPane下面的组件创建后被保留在dom树中 切换的时候会再次创建 span
  • 教你一步一步开发iOS私有SDK 到并上传到cocoapods

    1 需求 我们要提供一个iOS 私有 SDK 对方可以通过cocoapods安装 并且只能看到头文件 2 大致流程 使用Xcode创建一个framework工程 在里面编写你需要提供的功能创建podspec文件 依赖这个framework
  • flutterInAppWebview 拦截微信h5支付UNKNOWN_URL_SCHEME

    调用代码如下 if urlStr startsWith 34 weixin wap pay 34 await launchUrl uri flutter webview拦截微信h5支付时 提示err UNKNOWN URL SCHEME 只
  • iOS点击推送消息跳转到指定页面

    最近一直在搞推送消息跳转指定页面 点击通知栏 执行以下方法 void application UIApplication application didReceiveRemoteNotification NSDictionary userI
  • iOS把UIImage对象保存到本地沙盒

    1 保存 void saveImage UIImage image NSArray paths 61 NSSearchPathForDirectoriesInDomains NSDocumentDirectory NSUserDomainM
  • 解决Xcode9 app 图标不显示 iOS11app图标不显示

    升级到iOS11系统下自己的项目桌面app图标不见了 自己在Xcode9下新建一个工程看一下 设置图标是显示的 但是假如CocoaPod就不显示了 多方查询发现 图标不显示主要是cocoaPod出现了问题 需要在podfile文件加入以下脚
  • 手把手教你使用sourceTree提交到git远程仓库

    需求 本地有一个项目想上传到git远程仓库 工具 sourceTree Step1 首先本地创建一个空的文件夹 空文件夹的路径写到图片2的目标路径上 例如图片3 图片1 图片2 图片3 Step2 点击克隆 让后打开如下 如果工作副本没有东
  • ES6函数参数的解构赋值

    函数参数的解构赋值 span class token function add span span class token punctuation span span class token punctuation span span cl
  • ubuntu16 安装 docker 和K8S指导

    docker安装包 https download csdn net download van peak 10590104 安装docker软件 root 64 ubuntu 129 opt docker dpkg i docker ce 1
  • memmove和memcpy函数的区别及实现

    一 memmove 和memcpy 函数和strcpy 函数的区别 xff1b xff08 1 xff09 使用的类型不同 xff0c strcpy 函数只对字符串进行操作 xff1b memmove 和memcpy 函数对所有类型都适用