【C语言】常见的内存操作函数

news2024/10/9 12:35:09

目录

  • 前言:
    • 1.memcpy
      • memcpy函数介绍
      • memcpy函数的模拟实现
    • 2.memmove
      • memmove函数介绍
      • memmove函数的模拟实现
    • 3.memcmp
    • 4.memset

前言:

紧接字符串函数,接下来介绍内存函数~~
————————————————————

1.memcpy

memcpy函数介绍

在这里插入图片描述
memcpy函数的作用是内存拷贝

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0’ 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

memcpy函数的使用:

int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1, 16);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

打印结果:
在这里插入图片描述
整型数值一个元素4个字节,传过去16个字节即打印arr1里面的前4个元素,其他补0(可以拷贝整型数组、字符串和结构体,因为void * 的指针可以接收任意数据)

memcpy函数的模拟实现

void* my_memcpy(void* dest, const void* str, size_t num)
{
	assert(dest && str);
	void* t = dest;
	while (num--)
	{
		*(char*)dest = *(char*)str;
		dest = (char*)dest + 1;
		str = (char*)str + 1;
	}
	return t;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 24);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

函数拷贝结束后,返回目标空间的起始地址
void * 可以接收任意数据类型,把它转换成char *,因为char类型的大小为1个字节,可以一个一个的接收某个数据类型(传过来的数据类型不确定),直到拷贝结束,返回目标空间的起始地址。

2.memmove

memmove函数介绍

在这里插入图片描述

memmove函数的参数与memcpy相同

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

memmove函数的使用:

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

memmove函数可以拷贝重叠的数组,从arr1第三个元素的地址开始拷贝,拷贝的数据从arr1首元素开始,拷贝的个数为6个,最后打印10个元素。

如果改成:

memmove(arr1, arr1 + 2, 20);.//3 4 5 6 7 6 7 8 9 10

就是从arr1的首元素地址开始拷贝,拷贝的数据从arr1的第三个元素开始,拷贝的个数为6个,最后打印10个元素。

memmove函数的模拟实现

void* my_memmove(void* dest, const void* str, size_t num)
{
	assert(dest && str);
	void* t = dest;
	if (dest < str)
	{
		while (num--)
		{
			*(char*)dest = *(char*)str;
			dest = (char*)dest + 1;
			str = (char*)str + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)str + num);
		}
	}
	return t;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1 + 2, arr1, 20);//从后向前拷贝
	//my_memmove(arr1, arr1 + 2, 20);//从前向后拷贝
	int i = 0;
	for (i = 0; i < 10; i++)
    {
		printf("%d ", arr1[i]);
	}
	return 0;
}

重叠拷贝有两种情况:(防止拷贝的元素有重叠)
1.从前向后拷贝;
2.从后向前拷贝。
在这里插入图片描述
如果dest<str,从前向后拷贝;反之,则从后向前拷贝。

3.memcmp

在这里插入图片描述
memcmp函数的作用是内存比较
比较从ptr1和ptr2指针开始的num个字节
返回值如下:
在这里插入图片描述
比较的字节相同,返回0;
比较的字节ptr1大于ptr2,返回>0;
比较的字节ptr1小于ptr2,返回<0;

memcmp函数的使用:

int main()
{
	int arr1[] = { 1,2,1,4,5,6 };
	int arr2[] = { 1,2,257 };
	int len = memcmp(arr1, arr2, 9);
	printf("%d\n", len);
	return 0;
}

返回的结果是0,它是一个字节一个字节比较的
在这里插入图片描述

4.memset

在这里插入图片描述
memset函数的作用是把ptr指向的前num个字节的内容设置成value的值(把value的值以字节为单位一个一个放到ptr里)

memset函数的使用:

int main()
{
	char arr[] = "abcdefgh";
	memset(arr + 2, 'y', 3);
	printf("%s\n", arr);
	return 0;
}

打印结果:
在这里插入图片描述
arr+2:指向arr的第三个元素,从这开始设置要设置的值;
‘y’:要设置的值;
3:设置3个,从字符c开始把cde设置为字符y

感谢观看~~
在这里插入图片描述

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

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

相关文章

索尼移动硬盘数据丢失怎么办?索尼移动硬盘如何恢复数据

咨询案例&#xff1a;“我刚买的索尼移动硬盘&#xff0c;里面存了超多我的宝贝照片和视频。突然有一天&#xff0c;我发现这些数据全都不见了&#xff01;心凉了半截&#xff0c;我该怎么办&#xff1f;” ——索尼移动硬盘是一种常用的存储设备&#xff0c;它具有大容量、便携…

微软亚研院提出模型基础架构RetNet或将成为Transformer有力继承者

作为全新的神经网络架构&#xff0c;RetNet 同时实现了良好的扩展结果、并行训练、低成本部署和高效推理。这些特性将使 RetNet 有可能成为继 Transformer 之后大语言模型基础网络架构的有力继承者。实验数据也显示&#xff0c;在语言建模任务上&#xff1a; RetNet 可以达到与…

视频内存过大如何压缩变小?这个压缩方法了解一下

在日常生活中&#xff0c;不管是日常随手拍的视频还是在工作中遇到的视频文件&#xff0c;在编辑处理的时候&#xff0c;如果视频的内存过大&#xff0c;不仅会占用很大的内存&#xff0c;在传送的时候也会花费很长时间&#xff0c;这时候将视频给压缩一下就可以很好的解决这一…

直播程序源码开发建设:洞察全局,数据统计与分析功能

在信息时代的浪潮席卷下&#xff0c;直播程序源码平台成为了信息时代下的优秀产物之一&#xff0c;通过直播程序源码平台&#xff0c;人们既可以去获取信息、收获快乐&#xff1b;又可以开启一个随时随地&#xff0c;一台智能手机就可以做的工作&#xff0c;直播工作&#xff0…

ResMLP:具有数据效率训练的图像分类前馈网络

文章目录 ResMLP: Feedforward networks for image classification with data-efficient training摘要本文方法代码实验结果 ResMLP: Feedforward networks for image classification with data-efficient training 摘要 我们提出了ResMLP&#xff0c;一个完全建立在多层感知…

Windows系统创建新用户

1、以管理员身份启动cmd 2、开启administrator管理员账户 输入命令&#xff1a; net user Administrator /active:yes 3、切换到administrator用户 点击账户头像可以看见 4、创建新用户 WinR 键打开dos窗口输入&#xff1a;control userpasswords2 在弹出的“用户账户”中点…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…

MFC CList 类的使用

MFC提供CList 类&#xff1b; 类CList支持可按顺序或按值访问的非唯一对象的有序列表&#xff1b;CList 列表与双链接列表行为相似&#xff1b; 类型POSITION的变量是列表的关键字&#xff1b;可使用POSITION变量作为循环因子来顺序遍历列表&#xff0c;作为书签来保存位置&am…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Python 面向对象(一)(成员方法、类和对象)

初识对象 生活中数据的组织 学校开学&#xff0c;要求学生填写自己的基础信息&#xff0c;一人发一张白纸&#xff0c;让学生自己填 改为登记表&#xff0c;打印出来让学生自行填写&#xff1a; 程序中数据的组织 在程序中简单使用变量来记录学生信息 使用变量记录数据太乱了…

Python怎么将图片转换成base64编码

目录 什么是base64编码 Base64编码的特点 Base64编码的应用 Python怎么将图片转换成base64编码 什么是base64编码 Base64编码是一种将二进制数据转换为ASCII字符的编码方式。它是由MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;规范定义的&#xff0…

CAD转PDF怎么从彩色变成黑白?这个小技巧要掌握

CAD文件&#xff0c;也被称为CAD文档或CAD绘图文件&#xff0c;是一种专用的计算机辅助设计文件格式。它通常用于表示二维或三维设计图形和相关的几何属性。CAD文件可以在计算机辅助设计软件中打开和编辑。 通常由一个或多个图层组成&#xff0c;每个图层可以包含不同的颜色、线…

day37回溯算法

1.什么是回溯算法 回溯就是递归问题&#xff1a; 解决组合问题&#xff08;无顺序&#xff09;&#xff0c;切割问题&#xff0c;子集问题&#xff0c;排列问题&#xff08;顺序&#xff09; 所有的回溯可以抽象为一棵树&#xff1a;树 宽度就是for循环大小 树深度就是回溯 vo…

HCIP——OSPF基础

OSPF基础 一、OSPF基础二、OSPF的区域划分三、OSPF的数据包hello包数据库描述包DBD包链路状态请求包LSR包链路状态更新包LSU包链路状态确认包LSAck包 四、OSPF的状态机五、OSPF的工作过程六、链路状态型的路由生成过程七、条件匹配五、OSPF数据包头部八、OSPF的接口网络类型 一…

C++的六大“天选之子“之“构造“与“析构“

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

【LeetCode】64.最小路径和

题目 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a;grid [[1,3,1],[1,5,1],[4,2,1]] 输出&#…

离多态更近一步

在面向对象的语言里面,封装,继承,多态可谓是在熟悉不过了,当我们每次再去重新认识它们的时候总会有新的发现,为此我也经常感到疑惑,所以在这里和大家一起探讨三个问题,让我们在向多态靠近一点点。 虚表是否真的存在静态区 经常我们都会看见一个问题&#xff0c;虚表到底是存放…

使用show effective grants查看权限

1、问题描述 用户 show grants 显示只有连接权限&#xff0c;但该用户却能执行 sbtest.*下的所有操作 GreatSQL> \s ... Server version: 8.0.32-24 GreatSQL, Release 24, Revision 3714067bc8c ... GreatSQL> show grants; ---------------------------------------…

哪些在线工具能免费转换MP3格式?分享两个方法!

哪些在线工具能免费转换MP3格式&#xff1f;通常来说&#xff0c;MP3格式转换器都具备简洁的界面、便捷的操作以及强大的功能&#xff0c;它们可以将各种流行的视频或音频格式转换成MP3文件&#xff0c;甚至可以制作手机铃声。用户只需要在设置中设定录制时间&#xff0c;即可轻…

MIT 6.830数据库系统 -- lab four

MIT 6.830数据库系统 -- lab four 项目拉取引言事务、锁 & 并发控制事务ACID特性两阶段锁 Recovery and Buffer ManagementGranting Locks(授予锁)练习1 Lock Lifetime练习2 Implementing NO STEAL练习3 事务练习4 死锁和中止练习5 项目拉取 原项目使用ant进行项目构建&am…