Day_15 > 内存相关的函数

news2024/11/23 22:41:51

目录

1.memcpy

1.1memcpy函数的使用

1.2memcpy函数的模拟实现

2.memmove

2.1memcpy存在的局限性

2.2memmove函数的使用

2.3memmove函数的模拟实现

3.memset

3.1memset函数的使用

4.memcmp

4.1memcpy函数的使用


之前我们可能了解过字符串函数,今天我们了解一下内存相关的函数

1.memcpy

1.1memcpy函数的使用

strcpy函数我们可能都知道,字符串拷贝函数,跟函数名一样,只能拷贝字符串

但是我们知道,内存中的数据不仅仅是字符

int arr1[10] = { 0 };
int arr2[] = { 1,2,3,4,5 };

比如,当我们有这么一段数据

我们需要把arr2中的前五个整型的数据拷贝放在arr1中 

这个时候我们就不能使用strcpy,因为他是整型数据了

这时候我们C语言就提供了memcpy函数,同样的,我们在Reference - C++ Reference (cplusplus.com)上学习一下该函数

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

 我们可以理解为,把source中的前num个字节的数据拷贝放到destination中去

我们还是用监视窗口来看一下数据是否被拷贝

我们可以看到确实是被拷贝过去了 

1.2memcpy函数的模拟实现

void* my_memcpy(const void* dest, const void* src, size_t sz)
{
	assert(dest && src);
	while (sz--)
	{
		*(char*)dest = *(char*)src;
		dest=(char*)dest+1;
		src=(char*)src+1;
	}
}

运行的结果也是同样的效果

这里我们要注意

void*是不能直接++和--的,所以我们需要强转为char*类型,++或--跳过一个字节的空间

void*是不能直接解引用的,所以我们需要强转为char*类型,解引用

2.memmove

2.1memcpy存在的局限性

我们这个代码也是存在一定的局限性,比如下面这种情况

将数组arr的前五个数据拷贝到arr[2]的位置,通过调试我们发现写出来的函数并不能有效的实现

C语言的标准规定:

不重叠内存的拷贝,可以使用memcpy,重叠内存的拷贝就不能使用了

重叠内存的拷贝,我们可以使用memmove函数来实现 

2.2memmove函数的使用

同样的,我们来先学习一下memmove函数的使用

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

他的参数和返回类型和memcpy一模一样,

我们尝试使用一下memmove函数,看能否解决刚才的问题

这样问题就很好的解决了 

2.3memmove函数的模拟实现

#include <stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(const void* dest, const void* src, size_t sz)
{
	void* ret = dest;
	assert(dest && src);
	if (dest < src)
	{
		//前->后
		for(int i=0;i<sz;i++)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//后->前
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)src+sz);
			/*dest = (char*)dest - 1;
			src = (char*)src - 1;*/
		}
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr1+2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	my_memmove(arr2 , arr2+2, 20);
	for (int j = 0; j < 10; j++)
	{
		printf("%d ", arr2[j]);
	}
	return 0;
}

 这样我们的代码就能实现memmove的效果了

3.memset

3.1memset函数的使用

void * memset ( void * ptr, int value, size_t num );

memset函数是以字节为单位设置内存的函数 

将 ptr 指向的内存块第1个字节(num)设置为指定(value)

举个例子

4.memcmp

4.1memcpy函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

memcmp函数作用是比较ptr1和ptr2指向的内存空间的前num个字节的数据

  • 如果相同则返回0
  • 如果ptr1指向内存的数据是小于ptr2指向内存的数据的,则返回小于0的数字
  • 否则返回大于0的数字

memcmp比较是以字节为单位比较的

举个例子

 

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

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

相关文章

如何使用固态硬盘+硬盘盒子+U盘创造移动双系统

本文背景 这学期上了一节鸟水课《大数据实践》&#xff0c;老师要求扩展硬盘盒&#xff0c;以部署大数据工具进行 机器挖掘等大数据领域工作 参考视频链接&#xff1a;无需启动盘&#xff0c;用虚拟机将ubuntu安装到移动硬盘上_哔哩哔哩_bilibili 项目使用设备 1.绿联&#…

C/C++运算符超详细讲解(系统性学习day5)

目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念&#xff1a; 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…

Ubuntu出现无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

1、在Ubuntu系统安装sublime是出现以下这个问题&#xff1a; 解决方法&#xff1a; 使用以下命令强制解锁&#xff1a;&#xff08;删除“/var/lib/dpkg”目录下的 “lock-frontend” 和“lock”两个文件&#xff09; sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/…

代码随想录算法训练营第56天|583. 两个字符串的删除操作,72. 编辑距离 (昨天的疑虑今天豁然开朗了)

链接: 583. 两个字符串的删除操作 链接: 72. 编辑距离 583. 两个字符串的删除操作 class Solution {public int minDistance(String word1, String word2) {int len1 word1.length(), len2 word2.length();int[][] dp new int[len1 1][len2 1];for (int i 0; i < le…

Android开发笔记 :理解Fragment

Android开发笔记&#xff1a;理解Fragment 导言 本篇文章产生的原因很简单&#xff0c;就是我在了解Android Jetpack中的Lifecycle框架时发现Lifecycle具体时间和状态的更新都是由一个名为ReportFragment的Fragment来跟踪的&#xff0c;为了更好的了解Fragment是如何追踪Activ…

【软件测试】测试中的风险有哪些?

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; ​那么到底都有哪些风险要注意呢?如何解决呢?另外这些风险如何在计划中写明呢&#xff0c;不会写“张三…

汇编语言课程设计1 代码 优化版

assume cs:codesgstacksg segmentdw 16 dup(0) stacksg endsdatasg segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983db 1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995;以上是表示21年的21个字符串dd 16,22,382,1356,2390,8000,16000,24286,50065,97…

基于Java的酒店管理系统设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

文件-计算平均分

任务描述 本关任务&#xff1a;假设有若干学生&#xff0c;每个学生有3门功课&#xff0c;从键盘上输入学生有关信息&#xff08;学号、姓名、成绩&#xff09;&#xff0c;并计算其平均成绩&#xff0c;将原有数据和平均分保存在磁盘文件record中。具体要求如下: 学生有关信…

【计算机毕业设计】基于SpringBoot+Vue大学生心理健康管理系统的开发与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

计算机图形学中的几何光学

文章目录 前言一、图形学中的光学二、光照模型1、经验型&#xff08;简单&#xff09;2、物理型&#xff08;复杂&#xff09; 前言 在学习Shader光照之前了解一下计算机图形学 一、图形学中的光学 镜面反射的效果例子&#xff1a;物体表面高光 慢反射的效果的例子&#xff1a…

Python中获取主机名和IP地址的方法

在Python中&#xff0c;可以通过socket模块中gethostname()、getfqdn()和gethostbyname()方法获取本地和远程主机名和IP地址。 1 获取本地和远程主机名 1.1 获取本地主机名 可以通过gethostname()方法获取本地主机名&#xff0c;也就是本机的主机名&#xff0c;代码如下所示…

智能电力运维系统:数字化转型在电力行业的关键应用

随着信息技术、人工智能等的飞速发展&#xff0c;数字化改造已成为各行各业的重要发展趋势。在电力行业中&#xff0c;智能电力运维系统是数字化转型的关键应用之一。 力安科技智能电力运维系统是一种集自动化、智能化、云计算、物联网等先进技术于一体的电力运维管理解决方…

JS-ECharts-前端图表 多层级联合饼图、柱状堆叠图、柱/线组合图、趋势图、自定义中线、平均线、气泡备注点

本篇博客背景为JavaScript。在ECharts在线编码快速上手&#xff0c;绘制相关前端可视化图表。 ECharts官网&#xff1a;https://echarts.apache.org/zh/index.html 其他的一些推荐&#xff1a; AntV&#xff1a;https://antv.vision/zh chartcube&#xff1a;https://chartcub…

RocketMQ高性能核心原理与源码架构剖析(下)

四、融汇贯通阶段 开始梳理⼀些⽐较完整&#xff0c;⽐较复杂的完整业务线。 8 、消息持久化设计 1 、 RocketMQ 的持久化⽂件结构 消息持久化也就是将内存中的消息写⼊到本地磁盘的过程。⽽磁盘 IO 操作通常是⼀个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xf…

图像处理与计算机视觉--第三章-颜色与纹理分析-6问

图像处理与计算机视觉--第三章-颜色与纹理分析-6问 1.哪些因素决定物体颜色的感知? 对于物体颜色的感知&#xff0c;主要取决于以下三个因素: 1.照射到物体表面光波长的分布 2.物体表面如何反射照射光 3.传感器或者视觉细胞的敏感性 除了上述的三个因素之外&#xff0c…

nuc980学习笔记7-设置开机自启动

测试条件&#xff0c;nuc980开发板。 一、开机启动脚本 为什么需要开机自启动脚本&#xff1f;我们编写完程序之后&#xff0c;下载到开发板&#xff0c;往往需要程序开机自行启动&#xff0c;为了实现开机自启动&#xff0c;则需要编写相关的脚本。 二、设置开机启动的步骤 开…

2009-2022年上市公司华证 ESG数据

2009-2022年华证 ESG数据&#xff08;年度&#xff09; 1、时间&#xff1a;2009-2022年 2、范围&#xff1a;沪深A股上市公司 指标&#xff1a;证券简称、证券代码、华证ESG评级 2009-2022年华证ESG数据&#xff08;季度&#xff09; 1、时间&#xff1a;2009/03/31---20…

在React中,什么是组件的状态(state)?如何更新组件的状态?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 创建和初始化状态⭐ 更新状态⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

力扣-228.汇总区间

AC Code 自己做出来的&#xff0c;代码写的很烂&#xff0c;但是也浅浅记录一下叭&#xff0c;下面有看答案思路写出来的双指针代码 class Solution { public:vector<string> summaryRanges(vector<int>& nums) {vector<string> ans;int n nums.size();…