每天学习一个字符串类函数之memmove函数

news2024/9/16 23:10:40

目录

前言:

一、头文件

二、memmove函数的作用

三、理解memmove函数的定义

1、返回类型

2、参数

四、使用memmove函数

案例1:

案例2:

五、解决数据拷贝之前被覆盖的方法

六、模拟实现memmove函数


前言:

上一篇博客,我们已经对memcpy函数进行了学习,也指明了memcpy函数不能支持源位置与目标位置相交的情况的拷贝,而在这种情况下,我们就要使用memmove函数了。所有今天我们来深入学习memmove函数。希望大家可以认真看完。

一、头文件

memmove函数的头文件是和memcpy函数的头文件相同的,都是<cstring>(string.h),同样同样memmove函数也是面向所有数据类型的,故也称其为内存函数

C语言

#include <string.h>

C++

#include <cstring>

二、memmove函数的作用

将 num 字节的数据从 source 指向的位置复制到 destination 指向的内存块。复制就像使用中间缓冲区一样进行,从而允许目标位置源位置重叠

三、理解memmove函数的定义

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

1、返回类型

在C语言标准库函数的定义中,memmove函数的返回类型为一个void*的指针,用于返回目标位置的地址由于void*指针的数据类型不固定性,可用于返回所有类型的数据

2、参数

在C语言标准库函数的定义中,memmove函数的参数有三个,第一个为void*destination(不固定类型的指针)用于接收目标位置的地址;第二个为const void*source(不固定类型的指针,前用const修饰,使程序不可通过该指针更改其指向的数据)用于接收源头位置的地址;第三个为size_t num用于表示要拷贝的数据的大小,单位是字节。

四、使用memmove函数

案例1:

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

函数代码运行前的监视结果: 

函数代码运行后的监视结果: 

案例2:

#include <string.h>
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

	memmove(arr1 + 2, arr1, 20);
	
	return 0;
}

 函数代码执行前的监视结果:

函数代码执行后的监视结果:

* 这里强调一下,在案例2中若使用memcpy函数其执行结果将为:

为什么会出现这种情况?

因为从memcpy函数的实现代码可知,在memcpy函数中数组的元素3、4、5已经在对其进行拷贝之前,便已经被1、2覆盖掉了。 这便是memcpy函数定义的局限性。

五、解决数据拷贝之前被覆盖的方法

对会被覆盖的数据,先进行拷贝;对不会被覆盖的数据,后进行拷贝。而要完成这点,必须区分源头位置与目标位置的第一个元素的大小。

六、模拟实现memmove函数

#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		//从前往后
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
			//*((char*)dest)++ = *((char*)src)++;
		}
	}
	else
	{
		//从后往前
		while(num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}

解释:

当源位置地址大于目标位置地址,从前往后拷贝,否则从后往前拷贝。(要是不太理解,可以试着用画图来表示数据的拷贝过程)

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

如果对本篇文章有疑惑,欢迎在评论区讨论。

注:“每天学习一个字符串类函数”类型文章已整理为专栏,欢迎大家订阅。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2116422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】STL容器详解【上】

目录 一、STL基本概念 二、STL的六大组件 三、string容器常用操作 3.1 string 容器的基本概念 3.2 string 容器常用操作 3.2.1 string 构造函数 3.2.2 string基本赋值操作 3.2.3 string存取字符操作 3.2.4 string拼接字符操作 3.2.5 string查找和替换 3.2.6 string比…

Unity Shader实现简单的各向异性渲染(采用各向异性形式的GGX分布)

目录 准备工作 BRDF部分 Unity部分 代码 实现的效果 参考 最近刚结束GAMES202的学习&#xff0c;准备慢慢过渡到GAMES103。GAMES103的作业框架为Unity&#xff0c;并没有接触过&#xff0c;因此准备先学一点Unity的使用。刚好101和202都是渲染相关的&#xff0c;因此先学习…

如何查看Mac的处理器架构‌‌是ARM还是x86

‌通过命令行查看Mac的处理器架构‌‌ 打开终端&#xff08;Terminal&#xff09;。输入命令 uname -m 并回车。如果输出结果是 arm64&#xff0c;则表示你的Mac使用的是ARM架构&#xff1b;如果输出结果是 x86_64&#xff0c;则表示你的Mac使用的是x86架构。 如图&#xff1…

牛客JZ36 二叉搜索树与双向链表 C++

牛客JZ36 二叉搜索树与双向链表 C 思路&#x1f9d0;&#xff1a; 由图所示&#xff0c;我们看出该链表走的是中序&#xff0c;所以我们可以使用中序遍历的方式来解决这个问题&#xff0c;在遍历过程中&#xff0c;我们创建一个前驱和一个后继结点&#xff0c;来进行链接。 并且…

基于stm32f407的跟随行驶系统项目报告(利用openmv+超声波模块)

2023年全国大学生电子设计竞赛&#xff08;TI杯&#xff09; 2024年05月29日 摘要 本项目的硬件结构&#xff1a;基于STM32F407芯片为主控芯片&#xff0c;由TB6612电机驱动&#xff0c;控制左右轮电机的转动控制小车提供前进前进的速度&#xff0c;通过控制两轮的差数达到稳定…

Hive中的分区表与分桶表详解

目录 分区表和分桶表 分区表 分区表基本语法 1. 创建分区表 2. 分区表读写数据 1&#xff09;写数据 &#xff08;1&#xff09;LOAD &#xff08;2&#xff09;INSERT 2&#xff09;读数据 3. 分区表基本操作 1&#xff09;查看所有分区信息 2&#xff09;增加分区 …

数据库MySQL零基础-下【详细】

目录 六、事务/视图/触发器/存储过程 1、事务的理解 &#xff08;1&#xff09;事务的理解 &#xff08;2&#xff09;事务的特性 2、事务的应用 &#xff08;1&#xff09;事务的开启与提交 # 语法 # 示例 &#xff08;2&#xff09;开启autocommit&#xff08;临时生…

MybatisPlus静态工具 通用枚举

静态工具 有的时候Service之间也会相互调用&#xff0c;为了避免出现循环依赖问题&#xff0c;MybatisPlus提供一个静态工具类&#xff1a;Db&#xff0c;其中的一些静态方法与IService中方法签名基本一致&#xff0c;就在方法例多给出一个参数&#xff0c;操作的实体类类型。…

P3285 [SCOI2014] 方伯伯的OJ

*原题链接* 本题与NOIP2017列队有很多共通之处&#xff0c;都是一开始给我们一个排好编号的队列&#xff0c;然后进行一些操作。 如果n的范围不大&#xff0c;我们会如何做呢&#xff1f;很容易想到权值线段树&#xff0c;以编号为下标建立权值线段树&#xff0c;维护每个下标…

WEB攻防-ASP安全MDB下载植入IIS短文件名写权限解析

知识点&#xff1a; 1、ASP环境搭建组合&#xff1b; 2、ASP-数据库下载&植入&#xff1b; 3、IIS-短文件&解析&写权限&#xff1b; WEB安全攻防 1、web源码&#xff1b; 2、开发语言&#xff1b; 3、中间件平台&#xff1b; 4、数据库类型&#xff1b; 5、…

百度快照劫持之JS劫持诊断与恢复一例

劫持现象&#xff1a; 百度搜索结果中&#xff0c;被劫持网站出现在搜索结果中&#xff0c; 点击进入网站&#xff0c;网站显示正常&#xff0c;数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果&#xff0c;正常进入网站缺不会跳转到彩票网站。 初步认…

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理&#xff0c;打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名…

GO语言快速入门(比较乱)

一、环境安装 1、安装Go环境 1、官网下载 2、cmd-->go version 3、环境变量 GOROOT&#xff1a;go安装路径 GOPATH&#xff1a;go存放代码的路径 4、GOWorks新建三个文件 5、go env查看配置 2、安装编辑器 GoLand或者VSCode 3、HelloWorld package main //一个程序只有一个…

设计模式学习[5]---装饰模式

文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时&#xff0c;基于原有的设计类图进行讨论。其中涉及到了装饰模式&#xff0c;因为书本很早已经看过一遍&#xff0c;所以谈及到这个名词的时候…

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统&#xff0c;并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址&#xff08;Addressable&#xff09;时&#xff0c;您可以使用该资源的地址从任何地方加载它。无论资源是在…

php转职golang第二期

以下是一份简单的 Go 基本语法笔记&#xff1a; 变量与常量&#xff1a; • var 声明变量。• const 声明常量。数据类型&#xff1a; • 整型、浮点型、布尔型、字符串型等。流程控制&#xff1a; • if-else 语句。• for 循环。函数&#xff1a; • 定义和调用函数。数…

【Hot100】LeetCode—394. 字符串解码

目录 1- 思路栈实现四种情况处理 2- 实现⭐394. 字符串解码——题解思路 3- ACM 实现 原题链接&#xff1a;394. 字符串解码 1- 思路 栈实现四种情况处理 ① 遇到数字&#xff0c;进行倍数相加 、②遇到左括号&#xff0c;压栈之前的元素、③遇到右括号弹出&#xff0c;栈进行…

DFS 算法:洛谷B3625迷宫寻路

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法&#xff1a;记忆化搜索DFS 算法&#xf…

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation&#xff08;属性编辑&#xff09;、disentanglement&#xff08;解纠缠&#xff09;常用的两种做法&#xff1a;线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中&#xff0c;有一种非常简单的方法来引导G向某个方向进行生成&…

【Android】使用和风天气API获取天气数据吧!(天气预报系列之一)

【Android】使用和风天气API获取天气数据吧&#xff01;&#xff08;天气预报系列之一&#xff09; 古话说得好&#xff0c;要有天气预报&#xff0c;首先需要有天气&#xff0c;和预报。 今天给大家介绍一个好用的天气预报API&#xff1a;和风天气。以及webAPI的使用方法~&a…