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

59.【C语言】内存函数(memmove函数)

2.memove函数

*简单使用

memove:memory move

cplusplus的介绍 点我跳转

对比第59篇的memcpy函数

对比memmcpy函数的介绍如下区别:

部分翻译

memmove多了:Copying takes place as if an intermediate buffer were used(复制就像中间的缓存区使用一样), allowing the destination and source to overlap.

memcpy多了:, and should not overlap (for overlapping memory blocks, memmove is a safer approach).

说明memmove允许source指针和destination指针有重叠

将arr[0]~arr[4]的内容复制到arr[2]~arr[6]中

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1+2, arr1, 5* sizeof(int));return 0;
}

*模拟实现

设计一个函数sim_memmove,参数及类型与memmove相同

方案1

线索:上方cplusplus的翻译

可以在函数中设计一个缓存区数组buffer来转移数据

#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{char buffer[1000] = { 0 };//最多移动1000个字符//s_src是save_source的缩写const char* s_src = (const char*)src;//s_dest是save_destination的缩写char* s_dest = (char*)dest;//保存返回值for (size_t i = 0; i < num; i++){buffer[i] = s_src[i];//s_src已经被强制类型转换过了,不用在循环的时候进行}src = s_src;for (size_t i = 0; i < num; i++){s_dest[i] = buffer[i];}return dest;
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };sim_memmove(arr+2, arr, 5* sizeof(int));return 0;
}

如果想让程序更安全

可以在开头加上:

由于函数的参数还有指针,按规范应该断言

// 如果 dest 和 src 重叠
if (dest == NULL || src == NULL || num == 0) 
{return dest;
}// 确保不超过 1000 字节
if (num > 1000) 
{return NULL; // 或者可以返回一个错误码
}

方案2

方案1可以优化,设计一个buffer数组会占用空间,只是需要考虑复制的方向

分为dest和src的部分是否有重叠进行讨论

1.有重叠
dest在src左侧

从src前向后复制,防止重叠

dest在src右侧

从src后向前复制,防止重叠

2.无重叠

从src前向后复制或从src后向前复制均可

比较dest和src的大小关系即可

代码
#define   _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void* sim_memmove(void* dest, const void* src, size_t num)
{void* s_dest = dest;if (dest == NULL || src == NULL || num == 0) {return dest;}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 s_dest;
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };sim_memmove(arr + 2, arr, 5 * sizeof(int));return 0;
}

总结

1.memcpy只考虑重叠的

2.memmove既考虑重叠又考虑不重叠的

建议复制字符串时用memmove

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • python爬虫初体验(二)
  • 611. 有效三角形的个数
  • pip install、yum install和conda install三者技术区分
  • Django一分钟:DRF快速实现JWT认证与RBAC权限校验
  • 《程序猿之设计模式实战 · 适配器模式》
  • Vue3中shallowRef和ref区别
  • MySQL篇(事务 - 基础)
  • STL队列
  • 部标(JT/T1078)流媒体对接说明
  • POI操作EXCEL插入图片
  • 两数之和、三数之和、四数之和
  • PTA矩阵转置
  • Vue|插件
  • 2024双11买什么东西比较好?2024双十一好物推荐
  • 【Qt】背景介绍
  • C++类的相互关联
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • PAT A1050
  • rabbitmq延迟消息示例
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring-boot List转Page
  • Vue2.0 实现互斥
  • vue中实现单选
  • 阿里云购买磁盘后挂载
  • 从tcpdump抓包看TCP/IP协议
  • 给Prometheus造假数据的方法
  • 官方解决所有 npm 全局安装权限问题
  • 力扣(LeetCode)56
  • 深度解析利用ES6进行Promise封装总结
  • Mac 上flink的安装与启动
  • PostgreSQL之连接数修改
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)常见O(n^2)排序算法解析
  • (160)时序收敛--->(10)时序收敛十
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (三) diretfbrc详解
  • (十)c52学习之旅-定时器实验
  • (十五)、把自己的镜像推送到 DockerHub
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法)Game
  • (五)activiti-modeler 编辑器初步优化
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 使用 XPath 来读写 XML 文件
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET分布式缓存Memcached从入门到实战
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET企业级应用架构设计系列之开场白
  • :“Failed to access IIS metabase”解决方法
  • @html.ActionLink的几种参数格式