memmove的算法思想

2023-05-16

1.memmove的用法

   C 库函数 void *memmove(void *str1, const void *str2, size_t n)str2 复制 n 个字符到str1,如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改.如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同.你可能不理解什么叫重叠,这里我补充一点,里面的思想可以看一下我的这篇博客,https://blog.csdn.net/T5211251314/article/details/123906025,为了更加详细点我给你们画一个是实现拷贝原理的图,下面的那个图是解释重叠.

图1:

图2:

注意:上面黑色字体的1,2,3,4,5代表拷贝顺序

dest指针指向地是被拷贝数组,src指针指向地是拷贝的源头内容

  看上图我本来想把数组内容3,4,5,6,7拷贝到同一数组的6,7,8,9,10的位置,这是没把握好src和dest的关系,此时src>dest,从图我们可以看到,显然不能实现我的初衷.下面图中的A和B的拷贝顺序才能实现我们的想法.自己要动笔注意观察dest和src的关系.结合后面的代码.

图3:

图4:

这是拷贝区域和源头区域不重叠的时候(将1,2,3,4,5拷贝到6,7,8,9,10),两种拷贝顺序均可以.

 2.代码实现

 这是图2-A的情况此时dest<src

#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest);
	assert(src);
	void* ret = (char*)dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;
		}
	}
	if (dest > src)
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//这是图3-A的情况此时dest<src
	my_memmove(arr1, arr1 + 2, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
}

 这是图2-B的情况此时dest>src

#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest);
	assert(src);
	void* ret = (char*)dest;
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			++(char*)dest;
			++(char*)src;
		}
	}
	if (dest > src)
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//这是图3-B的情况此时dest>src
	my_memmove(arr1 + 5, arr1 + 2, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
}

两种情况都可以实现不重叠时场景.

3.总结

 看这篇博客时一定要动笔,边动笔边思考你就会了,有不懂得欢迎评论区留言一定会答复,感谢阅读,点个赞吧.

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

memmove的算法思想 的相关文章

随机推荐

  • HDFS详解一

    前言 xff1a 一 HDFS的一些基本概念 xff1a 数据块 xff08 block xff09 xff1a 大文件会被分割成多个block进行存储 xff0c block大小默认为128MB 每一个block会在多个datanode上
  • potplayer播放器没有声音的解决方案

    potplayer播放器没有声音的解决方案 最近突然发现电脑上的potplayer播放视频文件的时候只有图像没有声音了 xff0c 卸载后重装依旧如此 经一番摸索 xff0c 解决方法如下 1 在播放界面按一下 m 键 xff0c 可以开启
  • 解决Mysql安装之后没有my.ini配置文件问题

    详记MySql问题大全集 三 安装之后没有my ini配置文件怎么办 系列目录 一 安装MySql 二 安装并破解Navicat 三 没有my in配置文件怎么办 四 设置MySql的大小写敏感 五 重置MySql登陆密码 之前说过 xff
  • 一个简单的环形进度条组件 vue-circleprogressbar

    vue circleprogressbar 一个简单的环形进度条组件 最近在开发可视化大屏项目中经常会用到环形进度条 但是常用的echarts组件对环形进度条的支持不太好 写起来比较麻烦 就想着自己写一个VUE的环形组件 满足自己日常开发需
  • Hbuilder如何创建并运行Vue项目

    在Hbuilder中开发Vue项目是非常快捷的 xff0c 下面小编给大家分享一下如何在Hbuilder中创建并运行Vue项目 方法 步骤 1 首先打开Hbuilder创建一个新项目 xff0c 如下图所示 2 Hbuilder如何创建并运
  • 教大家防止Jar包被反编译

    xff08 待验证 xff09 方法就是 xff0c 向Jar注入无效代码 xff08 不合法的 xff0c 或者根本不是代码的字符串 xff09 那么无效的代码又怎么能正确运行呢 xff1f 答案就是 xff0c 你要保证你的代码永远不会
  • 推荐3个小程序开源组件库——Vant、iView、ColorUI

    推荐3个小程序开源组件库 在进行小程序开发时 xff0c 经常会遇到编写组件方面的阻碍 xff0c 这让我们花费大量的时间在页面以及 CSS 样式编写上 因此可以使用开源组件库 xff0c 有些复杂的组件可以直接拿来使用 xff0c 节省开
  • 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    两种原因 第一种为程序的运行以平台系统位数不匹配 第二种则是该死的VS整出来的 一般在下面三种情景下会发生 1 64位系统上C 调用32位的C 43 43 dll 2 64位系统上IIS发布含有32位的 dll应用程序时 3 64位系统上编
  • 怎么进bios设置硬盘启动顺序|电脑bios硬盘启动设置方法

    怎么在BIOS里设置硬盘启动 xff1f 电脑在启动时会从硬盘寻找引导文件 xff0c 从而启动系统 xff0c 如果硬盘不是第一启动项 xff0c 或者有两个硬盘 xff0c 就会导致系统无法启动 xff0c 这时候就需要进BIOS设置硬
  • Windows计划任务执行时不显示窗口的问题

    最近开发了工具 xff0c 带界面的 xff0c 需要定时执行的 xff0c 为了方便直接用Windows计划任务做定时了 跑了一段时间发现 xff0c 进程中也有 xff0c 就是看不到程序的界面 xff0c 进程的执行貌似也阻塞了 从网
  • JAVA的@EXCEL导出导入常用注解汇总

    在实际开发中经常需要使用导入导出功能来加快数据的操作 在项目中可以使用注解来完成此项功能 在需要被导入导出的实体类属性添加 64 Excel注解 参数类型默认值描述sortintInteger MAX VALUE值越小越靠前readConv
  • MySQL中order by排序将NULL排在最前或最后面

    NULL的意思表示什么都不是 xff0c 或者理解成 未知 也可以 xff0c 它与任何值比较的结果都是false 注意 xff1a 默认情况下 xff0c MySQL会认为NULL值比其他类型的数据小 xff0c 也就是说 xff1a 在
  • C# 如何获取本机IP

    百度搜索的方案 如果你去百度C 如何获取本机IP xff0c 那么大概率的你会得到以下的几段代码 xff0c 第一种就是这样 xff1a string name 61 Dns GetHostName IPAddress ipadrlist
  • winform DevExpress contextMenuStrip右键事件

    span class token keyword private span span class token return type class name span class token keyword void span span sp
  • Linux TCP连接数限制配置

    在进行接口测试时 xff0c 在用户数超过400后 xff0c 就会出现socket connection reset xff0c 明显就是系统无法创建连接 xff0c 查看此时系统建立的TCP连接 xff0c netstat ant gr
  • 摘要认证及实现HTTP digest authentication

    最近工作需要做了摘要认证 xff08 digest authentication xff09 xff0c 下面就工作中遇到的问题及过程做一个总结 第一次客户端请求 GET POST 服务器产生一个随机数nonce xff0c 服务器将这个随
  • HTTPURL Connection及session保存问题

    HTTPURL Connection及session保存问题 HTTPURL Connection是一种多用途 轻量极的HTTP客户端 xff0c 使用它来进行HTTP操作可以适用于大多数的应用程序 虽然HttpURLConnection的
  • SpringBoot 集成redis-jedis

    SpringBoot 集成redis jedis 配置application properties中的redis Redis配置 Redis数据库索引 xff08 默认为0 xff09 spring redis database 61 0
  • Python爬虫常用之登录(三) 使用http请求登录

    前面说了使用浏览器登录较为简单 不需要过多分析 而使用请求登录恰恰就是以分析为主 开发一个请求登录程序的流程 分析请求 gt 模拟请求 gt 测试登录 gt 调整参数 gt 测试登录 gt 登录成功 一 分析网页 从网页着手 打开博客园的登
  • memmove的算法思想

    1 memmove的用法 C 库函数 void memmove void str1 const void str2 size t n 从 str2 复制 n 个字符到str1 如果目标区域和源区域有重叠的话 memmove 能够保证源串在被