当前位置: 首页 > news >正文

memmove使⽤和模拟实现

一:memmove的使⽤

这是memmove在库里的定义,具体可在cplusplus.com查看

void * memmove ( void * destination, const void * source, size_t num )

• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

代码:

include <stdio.h> 
#include <string.h>
int main(){   int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };   memmove(arr1+2, arr1, 20);   int i = 0;    for (i = 0; i < 10; i++)  {        printf("%d ", arr1[i]);  }return 0; }

输出的结果:1 2 1 2 3 4 5 8 9 1

二:memmove的模拟实现

代码1:

void*my_memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {dst = (char*)dst + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return(ret);
}
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr+2, arr , 20);for (int i = 0; i < 10; i++){printf("%d  ", arr[i]);//1 2 1 2 3 4 5 8 9 10,结果}return 0;
}

代码2:

函数也可以这样写,结果一样

void* my_memmove(void* arr1, const void* arr2, size_t num)
{if (arr1 < arr2){while (num--){*(char*)arr1 = *(char*)arr2;arr1 = (char*)arr1 + 1;arr2 = (char*)arr2 + 1;}}if (arr1 > arr2){//	arr1 = (char*)arr1 + num - 1;//	arr2 = (char*)arr2 + num - 1;while (num--){*((char*)arr1+num-1)=*((char*)arr2+num-1);//法1 //取消注释就是另一种方法//	*(char*)arr1 = *(char*)arr2;//	arr1 = (char*)arr1 - 1;//	arr2 = (char*)arr2 - 1;}}
}

相关文章:

  • 数据结构和算法基础(二)
  • 基于 Java 的浏览器——JxBrowser使用分享
  • Sass是什么?有哪些优缺点?
  • 【代码随想录算法训练营第37期 第十七天 | LeetCode110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和】
  • python数据类型之列表
  • 海外媒体发稿的关键步骤和投稿策略:如何撰写高质量的新闻稿?国外软文发布平台有哪些?
  • 如何同一局域网下ssh远程登录
  • 提取COCO 数据集的部分类
  • 移动云ECS主机:未来云计算的驱动力
  • 局部放电试验变频电源
  • 牛客NC391 快乐数【simple 模拟法 Java/Go/PHP】
  • el-table 合并单元格_以合并属性值相同行为例
  • ysoserial下载和使用
  • PHP开发安全:专家级代码审计策略与方法
  • 前端vue 动态加载ts文件,动态调用ts内的方法
  • 【Amaple教程】5. 插件
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android组件 - 收藏集 - 掘金
  • CentOS 7 修改主机名
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • echarts花样作死的坑
  • Java 多线程编程之:notify 和 wait 用法
  • PHP 7 修改了什么呢 -- 2
  • python docx文档转html页面
  • React的组件模式
  • 产品三维模型在线预览
  • 高性能JavaScript阅读简记(三)
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 简单易用的leetcode开发测试工具(npm)
  • 每天一个设计模式之命令模式
  • 如何解决微信端直接跳WAP端
  • 软件开发学习的5大技巧,你知道吗?
  • 使用Gradle第一次构建Java程序
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微信小程序开发问题汇总
  • 一道面试题引发的“血案”
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #《AI中文版》V3 第 1 章 概述
  • #define
  • (1)Jupyter Notebook 下载及安装
  • (C语言)逆序输出字符串
  • (ibm)Java 语言的 XPath API
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET CLR基本术语
  • .Net IOC框架入门之一 Unity
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?