前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

打开C语言常用的内存函数大门(二)—— memmove()函数 (内含memmove的讲解和模拟实现)

作者头像
埋头编程
发布于 2024-10-16 09:18:57
发布于 2024-10-16 09:18:57
29200
代码可运行
举报
文章被收录于专栏:C/C++C/C++
运行总次数:0
代码可运行

1. 前言

在之前,我向大家介绍了C语言中的一个常用的内存函数memcpy函数。如果你还没看的话,建议你先去看memcpy函数这篇文章,因为接下来,可能会用到那篇文章的知识甚至会拓展没有讲过的知识。强烈建议先去看把一篇文章,文章链接:memcpy函数讲解及其模拟实现(点此查看即可)

那么在本文中,我将介绍继续介绍C语言中常用的内存函数——memmove()函数。

2. memmove()函数

memmove()函数的作用:将源空间的内容移动到目标空间上,也可以理解为将指定源空间的内容拷贝到目标空间中。

可能看到这里有的读者就会提出这么一个问题:

这不是跟memcpy()函数的功能一样吗?这是不一样的,可不敢将两者给弄混了。

2.1 memmove()函数与memcpy()函数的差异

在我们用memcpy函数时,不知道大家有没有想过这么一个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };

	memcpy(arr1+3,arr1,12); //用memcpy拷贝自身的数据给自身

	for (int i = 0; i < 10; i++)
	{
		printf("%d ",arr1[i]);
	}

	return 0;
}

在VS上面你可能会成功运行这段代码,但这并不意味着这段代码是不存在问题的。你若是换一个别的编译器,可能上面的代码就跑不起来了。为什么会这样呢?

事实上,这种行为在memcpy函数看来是属于未定义的行为(想要操作的同一个对象里的俩成员之间出现了内存交织的情况)。你不妨想一下,你对一个未定义的行为进行了操作,这不就属于脱离了编译器的掌控,这种行为是十分危险的。编译器要的是稳稳的幸福。

那既然不能这么做,那有没有别的办法?

答案是有的,就是本文的主角—— memmove函数。

这也正是导致memmove函数与memcpy函数的差异所在: memmove函数能够处理同一个对象里的俩成员间内存空间出现交织的情况,而这正是memcpy函数所做不到的

可能读者们听到这里还是有点懵逼,到底什么情况下会出现内存交织的情况?

下面我将给出一副图,看完这幅图你也许就会懂了:

图解
图解

结合着要求看,不难发现,元素4即是拷贝内容也是待拷贝内容的区域。不妨想一下,如果我们按照memcpy函数的方式进行内存操作时,那么元素1就会覆盖元素4的值,那么4这个数据就消失了。这个不是我们想看到的。因此,这也就是为什么memcpy函数处理不了内存空间有交织的数据的本质原因。

相信看完上述的解释后,你已经对memmove在什么情况下使用已经有大概的印象了。

那么接下来,我们就一起来探讨一下memmove函数如何使用?

2.2 memmove()函数的原型

memmove函数原型
memmove函数原型
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void * memmove ( void * destination, const void * source, size_t num );

这个跟memcpy的参数意思是一样的。为了提高读者们的学习效率,这里我就再写一遍:

返回值和形参

作用

返回值类型:void*

返回目的地空间的地址。(说大白话,就是返回你想要拷贝内容到那个空间的地址,不过我们很少会用到它的返回值)

destination

一个空指针类型的变量,指向待拷贝空间的地址处

source

const void* 指针类型的变量,指向拷贝内容的空间地址处

num

size_t类型的变量 , 表明我要拷贝多少个字节数的内容

2.3 memmove()函数的使用案例

案例一:拷贝整形数据

案例一
案例一

案例二:拷贝字符型数据

案例二
案例二

相信通过上述例子,你已经学会了如何使用memmove()函数。

3. memmove()函数的模拟实现

又到本文最精彩的时候了,函数的模拟实现。

以下是编程思路:

编程思路
编程思路

下面是实现代码(可以对着思路理解代码):

模拟实现的代码
模拟实现的代码

4. 总结

在本文中,我介绍了memcpy与memmove两个函数的差异、memmove函数的使用及其模拟实现。

希望读者们下来好好理解消化。

👍👍👍

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)
在之前写的文章中,我介绍了几个比较常用的字符串函数strlen、strcmp、strcpy。它们作用的对象只能是形如字符串类型的数据。 那这难免会引起我们心中一泡浓厚的求知欲——C语言有没有给我们提供一些类似于字符串函数的功能,但是这些函数的作用对象是所有的数据类型呢?如果你是这么想的,那么恭喜你🎇🎇🎇来对地方了。
埋头编程
2024/10/16
1.6K0
打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)
【C语言】内存函数的使用和模拟实现
   在之前我们学习了使用和模拟实现strncpy函数,它是一个字符串函数,用来按照给定的字节个数来拷贝字符串,那么问题来了我们想拷贝的不是字符串,而是整型、浮点型的数据,该怎么办呢?    这时候就要使用我们的内存函数memcpy,mem是memory的缩写,它原本是记忆的意思,在这里是内存的意思,它的作用范围就宽泛多了,因为它是对内存块的内容进行拷贝,不管内存中存放的是什么数据类型,都可以通过拷贝内存块来实现拷贝    但是使用函数memcpy需要包含的头文件还是<string.h>,接下来我们来看看这个函数的原型:
TANGLONG
2024/10/15
1150
【C语言】内存函数的使用和模拟实现
C语言:内存函数
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
小陈在拼命
2024/02/17
1220
C语言:内存函数
内存函数(C语言)
通过函数原型也发现,这个memcpy函数是一个函数参数,函数返回类型都是void无符号类型,这是说明该函数是一个,泛型函数,它可以接收任意类型的参数,使同一个函数能用于多种类型的数据。
技匠晓晨
2024/11/26
420
内存函数(C语言)
C语言----C语言内存函数
函数memcpy从source的位置开始复制num个字节的数据到destination指向的内存位置。
凯子坚持C
2024/09/23
2710
C语言——内存函数的使用和实现
1. 函数 memcpy从source(源头)的位置开始向后复制num个字节的数据到 destinstion (目的地)指向的内存位置。
迷迭所归处
2024/11/19
1140
C语言——内存函数的使用和实现
C语言从入门到实战——常用内存函数的了解和模拟实现
assert断言函数,用来断言指针,count用来计数,根据输入的位数进行字节拷贝
鲜于言悠
2024/03/20
1290
C语言从入门到实战——常用内存函数的了解和模拟实现
C语言——K/C语言内存函数
• 函数 memcpy 从 source 的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 '\0' 的时候并不会停下来。 • 如果 source 和 destination 有任何的重叠,复制的结果都是未定义的。
用户11015888
2024/03/11
970
C语言——K/C语言内存函数
内存函数​(memcpy、memmove、memset、memcmp)
当ptr1<ptr2时,返回值<0 当ptr1=ptr2时,返回值=0 当ptr1>ptr2时,返回值>0
走在努力路上的自己
2024/01/26
8830
内存函数​(memcpy、memmove、memset、memcmp)
C语言(内存函数)
memcpy 前面的 mem 指的是 memmory ,英文单词“记忆”,在C语言中指的是内存。后面要介绍的 memmove、memset 和 memcmp 都是如此。
_小羊_
2024/10/16
730
C语言(内存函数)
【C语言】内存函数
·函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置
羚羊角
2024/10/21
610
【C语言】内存函数
C语言(11)----内存函数
内存函数主要用于动态分配和管理内存,它直接从指针的方位上进行操作,可以实现字节单位的操作。
Skrrapper
2024/06/18
1040
C语言(11)----内存函数
【C语言】memcpy()函数(内存块拷贝函数)
我们先来看一下cplusplus.com - The C++ Resources Network网站上memcpy()函数的基本信息:
修修修也
2024/04/01
1.1K0
【C语言】memcpy()函数(内存块拷贝函数)
【C语言】内存函数
从这篇开始,我们开始学习C语言的内存函数——memcpy、memmove、memset、memcmp
平凡的人1
2022/11/15
8940
【C语言】内存函数
c语言内存函数
void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
用户11367247
2024/11/20
290
c语言内存函数
memmove函数和memcpy函数的模拟实现
他的函数所需参数如下 1.函数memcpy从source的位置开始向后复制num个字节的数据destination 指向的内存位置。 2.这个函数在遇到 ‘\0’ 的时候并不会停下来。 3.如果source和destination有任何的重叠,复制的结果都是未定义的
ahao
2024/03/19
910
memmove函数和memcpy函数的模拟实现
【C】剖析C语言内存函数
字符串函数针对的是一个个的字符,而内存函数顾名思义关注的是内存,存储在内存中的一个个字节。
用户11316056
2024/10/16
670
【C】剖析C语言内存函数
C语言——动态内存管理与内存操作函数
主要是系统用于自动分配给全局变量、static修饰的变量内存的。它们在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。
星辰与你
2024/10/17
890
C语言——动态内存管理与内存操作函数
【C语言】内存函数
这个函数有点类似于上篇博客的strncpy,但是strncpy只能拷贝字符串的,而咱们现在遇到的函数是memcpy,这个没有具体拷贝什么,它的功能就是将一个内存块里的数据拷贝到另一个内存块
用户11290673
2024/09/25
770
【C语言】内存函数
打开常用C语言常用内存函数的大门 ——memcmp函数及其模拟实现(完结篇)
memcmp函数的作用:比较两个不同数据对象的num个字节的内容。如果提前发现不同的内容时,就终止比较,返回一个非0值。反之,返回0。
埋头编程
2024/10/16
4050
打开常用C语言常用内存函数的大门 ——memcmp函数及其模拟实现(完结篇)
相关推荐
打开C语言常用内存函数的大门(一) —— memcpy()函数 (内含讲解用法和模拟实现)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文