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

memmove函数(带图详解)

c语言系列


文章目录

  • c语言系列
  • 一、memmove函数介绍
    • 1.1、函数基本功能
    • 1.2、函数参数
    • 2.3、函数返回值
  • 二、memmove的使用
    • 2.1、拷贝字节不可大于目标空间
    • 2.2、同一空间拷贝
  • 三、函数功能的模拟实现
    • 3.1、函数参数及其返回值的设定
    • 3.2、函数体实现
  • 四、代码实现


一、memmove函数介绍

下面为该函数基本功能的介绍

在这里插入图片描述

1.1、函数基本功能

memmove的功能是将source指针指向空间的前num个字节,拷贝到detination指针指向的空间,不同于memcpy函数的是,memmove函数允许,两个指针指向的空间有重合。

1.2、函数参数

第一个参数:它是无类型指针(void*),指向要拷贝的目标地址,因此也称为目标指针。
第二个参数:它是const修饰的无类型指针(void*),指向要拷贝的源地址,因此称为源指针。
注:const修饰指针类型时在*之前修饰,代表该指针指向对象的内容不能被修改(地址里的内容不能改);在 * 之后修饰,代表该指针指向的对象不能被修改(指针本身不能被修改)
第三个参数:无符号整型,代表拷贝字节数(拷贝字节不可能为负数)

2.3、函数返回值

无类型指针(void*),函数运行结束后返回拷贝后的目的地内存块的起始地址.

二、memmove的使用

memove的返回值及两个参数的类型均为void*这也就意味着它可以适应绝大多数类型。相信绝大多数人来学习这个函数,都是因为碰到了memcpy解决不了的场景了,而memmove相比之memcpy最大的优点就是在面对目的地内存块和源头内存块重叠空间是,依然可以安全的进行拷贝操作,当然对于不重叠情况它依然是可以解决的。

下面我们来演示一下,拷贝中可能遇到的情景,以便我们接下来的模拟实现,对下面的情况在模拟时,我会再仔细分析的。

2.1、拷贝字节不可大于目标空间

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8 };int arr2[5] = { 0 };memmove(arr2, arr1, sizeof(arr1[0])*8);//sizeof(arr1[0])*8,代表拷贝八个数组元素的字节return 0;
}

在这里插入图片描述
当拷贝空间大于目标空间时程序崩溃。

2.2、同一空间拷贝

情况一:
拷贝源空间与目的空间不重合,代码及执行结果
在这里插入图片描述

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8 };memmove(arr+8, arr, sizeof(arr[0])*2);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

画图分析:

在这里插入图片描述
将source指向空间的前两个元素拷贝到detination指向的空间(detination指向空间不足没有影响)。

情况二:
拷贝源空间与目标空间存在重合空间,且source指向空间在前(这里要注意,我对数组首元素地址进行加法操作(arr+1等)指针是向后走的,也就是说后面指针大于前面)
代码及其运行结果:
在这里插入图片描述

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8 };memmove(arr+3, arr, sizeof(arr[0])*4);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

画图分析:
在这里插入图片描述

情况三:
拷贝源空间与目标空间存在重合空间,且detination指向空间在前

代码及其运行结果:
在这里插入图片描述

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8 };memmove(arr, arr+3, sizeof(arr[0])*4);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

画图分析:
在这里插入图片描述

三、函数功能的模拟实现

在实现过程中我们对标库中的定义,以及需要具备的功能来模拟完成它。

3.1、函数参数及其返回值的设定

由于memmove函数本身就是内存拷贝函数,并没有参数和返回类型的限定,我们这里同库中一样即可。

3.2、函数体实现

在上面使用部分的讲解中,我们几乎将所有可能出现的情况都给大家展示出来了(异地空间拷贝同上),接下来我们只需实现一个可以满足这些功能的函数体及可,其它细节问题会在代码部分讲解。

情况一分析:

我用蓝色代表源空间待拷贝资源,红色代表目的空间

从前往后拷贝:
在这里插入图片描述
从后往前拷贝:
(进入函数先把指针先后移动)
在这里插入图片描述
这种情况没有涉及源空间,与目标空间的重合问题,所有是很简单的,无论是从前往后拷贝还是从后往前拷贝都是可以完成的。
情况二分析:

博主手残画的丑大家见谅!!!

在这里插入图片描述

从前向后拷贝,数据(4)就会盖.

在这里插入图片描述
当源指针指向空间与目标空间重合且源指针在目标指针前面时(source<detination),我们必须从后往前拷贝才不会发生数据覆盖
情况三分析:
在这里插入图片描述

数据覆盖

在这里插入图片描述
当源指针指向空间与目标空间重合且目标指针在源指针】前面时(detination<source),我们必须从前往后拷贝才不会发生数据覆盖

四、代码实现

对于异地拷贝时,无论是从前往后拷贝还是从后向前拷贝都是可以完成拷贝的。,。

void* my_memmove(void* destination, void* source, size_t num)
{assert(destination&&source);//判断是否为空指针char* dest = (char*)destination;const char* src = (char*)source;if (destination < source)//对标情况三{while (num--){*dest++ = *src++;}}else//对标情况二{while (num--){*(dest + num)= *(src + num);}}return destination;
}

写代码时才发现上面个第一个指针拼错了,但是不影响逻辑,大家见谅!!!
文章时我在复习时写的,如果哪有错误可以私信我,万分感谢!

相关文章:

memmove函数(带图详解)

c语言系列 文章目录 c语言系列一、memmove函数介绍1.1、函数基本功能1.2、函数参数2.3、函数返回值 二、memmove的使用2.1、拷贝字节不可大于目标空间2.2、同一空间拷贝 三、函数功能的模拟实现3.1、函数参数及其返回值的设定3.2、函数体实现 四、代码实现 一、memmove函数介绍…...

【Java数据结构】时间和空间复杂度

本章开始将进入数据结构的知识&#xff0c;时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间&#xff0c;。 时间复杂度 算法中执行的次数决定了时间复杂度。 在计算执行次数时&#xff0c;只需要计算大概的次数&#xff…...

八斗深度学习

八斗深度学习第二周笔记 一、深度学习步骤&#xff1a;1. 选定模型结构2. 模型参数随机初始化3. 构造模型损失函数4. 选择优化算法并设置超参数5. 数据准备与预处理6. 训练模型7. 模型评估8. 测试模型9. 应用模型 损失函数极小值、导向意义 超参数的影响迭代次数epoch批次量大小…...

安卓报错Switch Maven repository ‘maven‘....解决办法

例如&#xff1a;Switch Maven repository ‘maven(http://developer.huawei.com/repo/)’ to redirect to a secure protocol 在库链接上方添加配置代码&#xff1a;allowInsecureProtocol true...

Scala编程技巧:正则表达式与隐式转换

1. 引言 在Scala编程中&#xff0c;正则表达式和隐式转换是处理字符串匹配和类型转换的强大工具。本文将通过一个实用的示例——电话号码和身份证号码验证器&#xff0c;来展示如何使用这些工具。 2. 知识概括 2.1 正则表达式基础 正则表达式是用于字符串搜索和匹配的强大工…...

UnityShaderLab 实现黑白着色器效果

实现思路&#xff1a;取屏幕像素的RGB值&#xff0c;将三个通道的值相加&#xff0c;除以一个大于值使颜色值在0-1内&#xff0c;再乘上一个强度值调节黑白强度。 在URP中实现需要开启Opaque Texture ShaderGraph实现&#xff1a; ShaderLab实现&#xff1a; Shader "Bl…...

在Windows 10中使用SSH远程连接服务器(附花生壳操作方法)

SSH 在 linux 中是一种重要的系统组件&#xff0c;用户可以使用 SSH 来远程连接 linux 系统的计算机&#xff0c;或者传输文件。不过在 win10 以前&#xff0c;windows 并不原生支持 SSH&#xff0c;需要借助第三方工具来使用 SSH 功能。而实际上&#xff0c;微软在 2015 年就曾…...

在算网云平台云端在线部署stable diffusion (0基础小白超详细教程)

Stable Diffusion无疑是AIGC领域中的AI绘画利器&#xff0c;具有以下显著优势&#xff1a; 1、开源性质&#xff0c;支持本地部署 2、能够实现对图像生成过程的精确控制 虽然SD在使用上有很多的有点&#xff0c;但缺点也是不言而喻的&#xff0c;由于AI绘画的整个过程以及现…...

ubuntu存储空间不足快速解决

几个自己常用的释放空间命令&#xff0c;备忘 将文件夹下的文件按从大到小排列 ls -lhS /var/log/syslog 过大 sudo truncate -s 0 /var/log/syslog /var/log/Xorg.0.log.old过大 sudo truncate -s 0 /var/log/Xorg.0.log.old 清理系统日志文件&#xff1a; sudo journalctl --…...

Prescan simulink carsim联合仿真平台搭建问题总结

解决办法主要来自忠厚的老王&#xff1a;自动驾驶决策规划算法第二章第一节 决策规划仿真平台搭建_哔哩哔哩_bilibili 这部分直接复制的老王视频的&#xff1a; Q1:prescan安装了&#xff0c;但是找不到Demo_Carsim3D A1:这个文件夹是我自己建立的不是prescan自带的&#xff0…...

STM32(HAL_工程模板的搭建)

目录 一、准备文件 二、创建工程 三、创建分组 四、配置文件处理 五、编译错误处理 一、准备文件 准备HAL库文件: ST官网( 意法半导体-STMicroelectronics )搜索STM32Cube, 本文使用“STM32Cube_FW_F4_V1.24.1” 版本的HAL库, 使用的是F4的库文件。 创建文件&#xff1a…...

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行 1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装 介绍watchdog使用python–dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境 介绍Mac/linux创建虚拟…...

CAD C# 批量替换当前图中块

本案例功能为选择当前文档中一个块&#xff08;旧块&#xff09;&#xff0c;然后选择新图元&#xff08;新块&#xff09;&#xff0c;运行插件后新块将替换图中所有的旧块。 效果如下&#xff1a; public static class Class1{//选取对象替换块定义[CommandMethod("TT&…...

Android -- [SelfView] 自定义多行歌词滚动显示器

Android – [SelfView] 自定义多行歌词滚动显示器 流畅、丝滑的滚动歌词控件* 1. 背景透明&#xff1b;* 2. 外部可控制进度变化&#xff1b;* 3. 支持屏幕拖动调节进度&#xff08;回调给外部&#xff09;&#xff1b;效果 歌词文件&#xff08;.lrc&#xff09; 一. 使用…...

vscode 配置C/C++环境控制台参数

您可以通过以下步骤在VS Code中配置C/C环境的控制台参数&#xff1a; 1&#xff0c;打开VS Code并进入您的C/C项目 2&#xff0c;点击左侧的"调试"图标&#xff0c;然后点击顶部的齿轮图标&#xff0c;选择“launch.json”。 3&#xff0c;在"launch.json&qu…...

【HarmonyOS学习日志(13)】计算机网络之TCP/IP协议族(二)

文章目录 TCP/IP协议族ARPDNS标志字段&#xff1a;协商具体的通信方式和反馈通信状态DNS查询问题的格式资源记录&#xff08;Resource Record, RR&#xff09;格式&#xff1a;被用于应答字段、授权字段和额外信息字段 IP协议IP服务的特点无状态无连接不可靠 IP头部结构IPv4头部…...

多系统对接的实现方案技术分析

前言 随着信息化和大数据时代的到来&#xff0c;数据资产变得至关重要&#xff0c;企业纷纷上线多种软件系统和移动端应用以适应这一变化。这些系统和应用虽然发挥了各自的优势&#xff0c;但也导致了信息孤岛问题。为了解决这一问题&#xff0c;数据中台和异构系统集成技术应…...

kv类型算子使用

对kv类型的RDD数据集进行操作。 keys """ 获取所有的key转换算子"""inputRdd sc.parallelize([(laoda, 11), (laoer, 22), (laosan, 33), (laosi, 44)]) print(inputRdd.keys().collect()) # [laoda, laoer, laosan, laosi] values "&…...

3维建模blender

官网稳定版下载&#xff1a;https://www.blender.org/download/lts/ windows有安装版和portable版 教程&#xff1a;https://www.bilibili.com/video/BV1kX4y1m7G5 1. 基础操作 场景操作 场景位移&#xff1a;shift鼠标中键长按场景旋转&#xff1a;鼠标中键长按场景缩放&…...

百问FB网络编程 - UDP编程简单示例

6.5 UDP编程简单示例 ​ UDP服务器首先进行初始化操作&#xff1a;调用函数socket创建一个数据报类型的套接字&#xff0c;函数bind将这个套接字与服务器的公认地址绑定在一起。然后调用函数recvfrom接收UDP客户机的数据报。UDP客户机首先调用函数socket创建一个数据报套接字&…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...