【C语言】内存操作函数

news2024/11/20 10:34:38

目录

         一、memcpy函数

               1、memcpy函数的用途

               2、memcpy函数的使用

               3、memcpy函数的模拟实现

         二、memmove函数

               1、memmove函数的用途

               2、memmove函数的使用

               3、memmove函数的模拟实现

         三、memset函数

               1、memset函数的用途

               2、memset函数的使用

               3、memset函数的模拟实现

         四、memcmp函数

               1、memcmp函数的用途

               2、memcmp函数的使用

               3、memcmp函数的模拟实现


一、memcpy函数

    1、memcpy函数的用途

这个函数的作用是以字节为单位进行复制的。它与字符串函数中的strncmp函数有些类似,memcpy的应用范围更加广泛,而strncmp函数只适用于字符串,但memcpy函数适用于各种类型,因为它返回值为 void* ,形参列表中也是void* ,所以可以看出这个memcpy函数的适用范围比较广泛。具体用法如下: 

 注意:

1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。

2、这个函数在遇到 '\0' 的时候并不会停下来。

3、如果source和destination有任何的重叠,复制的结果都是未定义的。

    2、memcpy函数的使用

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr, 20);
	return 0;
}

 分析:因为memcpy函数是按字节拷贝的,所以我在这是设置了20个字节,也就是5个整形,计算机的内存又是小端存储并且还是十六进制的,所以就是下面的样子。

    3、memcpy函数的模拟实现

void* my_memcpy(void* dst, const void* src, size_t num)
{
	assert(dst && src);
	void* ret = dst;
	while (num--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;//将dst指针强转为char*类型此时指针解引用访问其地址上的一个
		src = (char*)src + 1;
	}
	return ret;
}

上面将地址强制类型转换为char*字符指针类型,我相信很多人疑惑,在这里之所以要强制类型转换,是因为通过一个循环从起始地址往后直到第num个元素地址,解引用对应的每一个内存单元进行赋值操作,最后实现的指定内存空间num个内存单元的拷贝。用最小的char类型拷贝,可以适应所有的类型。

二、memmove函数(可以自己拷贝自己)

    1、memmove函数的用途

这个函数的作用是可以解决含有重复部分的数组之间的内存复制。该函数的形参类型,返回类型和memcpy函数是一样的,但是该函数增加了一个功能,就是可以处理源内存块和目标内存块重叠部分。

注意:

1、和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

2、如果源空间和目标空间出现重叠,就得使用memmove函数处理。

    2、memmove函数的使用

int main()
{
	char arr[] = "abcdef";
	memmove(arr + 1, arr, 4);
	printf("%s\n", arr);

	char arr1[] = "abcdef";
	memmove(arr1, arr1 + 2, 4);
	printf("%s\n", arr1);
	return 0;
}

运行如下:

 

    3、memmove函数的模拟实现

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

三、memset函数

    1、memset函数的用途

 这个函数的作用就是讲一个数组中前num个字节,设置组成value值,具体用法如下:

注意:

使用该函数注意设置的字节个数即内存单元的个数,不要超过了要设置的内存最大大小导致越界访问。

    2、memset函数的使用

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

 运行如下:

    3、memset函数的模拟实现

void my_memset(void* arr, int value, size_t num)
{
	assert(arr);
	int i = 0;
	for (i = 0; i < num; i++)  
	{
		*((char*)arr + i) = value; 
	}
}

四、memcmp函数

    1、memcmp函数的用途

memcmp函数和strcmp函数用法极其相似,都是一个字节一个字节相比较的,比较的是ASCII的值,不过这函数可以比较任何类型的数据。

    2、memcmp函数的使用

int main()
{
	char arr[] = "123456";
	char arr1[] = "abcdef";
	int ret = memcmp(arr, arr1, 2);
	printf("%d\n", ret);
	return 0;
}

运行如下:

    3、memcmp函数的模拟实现

void* my_memcpy(void* dst, const void* src, size_t num)
{
	assert(dst && src);
	void* ret = dst;
	while (num--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}


本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。

老铁们,记着点赞加关注哦!!! 

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

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

相关文章

React 入门:实战案例 TodoList 修改 Todo Item的状态

文章目录目标实现效果实现思路实现步骤第一步&#xff1a;定义更改 Todo 状态的方法&#xff0c;以供调用第二步&#xff1a;App 组件传递更改 Todo 状态的方法给子组件 List第三步&#xff1a;List 组件传递更改 Todo 状态的方法给子组件 Item第四步&#xff1a;Item 调用更改…

Spring 6.0 正式发布,一文了解新特性

正式发布 Spring Framework 6.0 首个 RC 版本正式发布&#xff0c;可以开始使用了。 新特性 我们一起来看看这次6.0版本带来了哪些特性&#xff1f;需要注意的是该版本整个框架代码库现在基于 Java 17 源代码级别&#xff0c;所以如果你想使用需要升级版本到 JDK 17 才可以&a…

什么是FPGA fpga的核心作用

fpga名词解释&#xff1a;FPGA是英文Field Programmable Gate Array的缩写&#xff0c;即现场可编程门阵列&#xff0c;它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。 fpga核心做用&#xff1a;它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的&#…

【吴恩达机器学习笔记】十七、总结

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

计算机毕业设计springboot+vue基本医院公众号建设推动医疗卫生服务现状研究

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,医院公众号建设推动医疗卫生服务就是信息时代变革中的产物之一。 任…

从零开始学Java之eclipse的安装配置与使用,看这篇就够了

前言 在上一篇文章中&#xff0c;壹哥给大家介绍了Notepad这个更高级点的记事本&#xff0c;它进行Java开发相比windows自带的记事本要更方便一些。但是即便如此&#xff0c;用这种记事本进行Java开发效率依然很低。如果是少量的代码编写还好说&#xff0c;大量代码的开发&…

计算机毕业设计springboot+vue基本微信小程序的电子书阅读器小程序

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,电子书阅读器小程序就是信息时代变革中的产物之一。 任何系统都要遵循…

【云原生】Kubernetes(k8s)Istio Gateway 介绍与实战操作

文章目录一、概述二、Istio 架构三、通过 istioctl 部署 Istio1&#xff09;安装istioctl 工具2&#xff09;通过istioctl安装istio3&#xff09;检查四、Istio Gateway五、Istio VirtualService 虚拟服务六、示例演示&#xff08;bookinfo&#xff09;1&#xff09;安装bookin…

MATLAB | 一起来感受数学之美,第一届迷你黑客大赛回顾

Hey真的是好久不见&#xff0c;最近确实是比较忙更新频率也下来了&#xff0c;过段时间应该能恢复正常更新速度&#xff0c;之前给大家解说过今年举办的math is beautiful迷你黑客大赛&#xff0c;但这其实是第二届大赛&#xff0c;本期推送带大家回顾一下第一期大赛&#xff0…

为什么索引可以让查询变快?终于有人说清楚了!

概述 人类存储信息的发展历程大致经历如下&#xff1a; 由于是个人凭着自己理解总结的&#xff0c;因此可能不一定精确&#xff0c;但是毋庸置疑的是&#xff0c;在当代&#xff0c;各大公司机构部门的数据都是维护在数据库当中的。 数据库作为数据存储介质发展的最新产物&am…

大数据面试之MapReduce常见题目

大数据面试之MapReduce常见题目 MapReduce中Shuffle过程及优化 1.1 Shuffle的详细图解 1.2 Shuffle的详细文字过程 Shuffle文字部分描述&#xff1a; ​ Shuffle横跨Map和Reduce阶段&#xff0c;是指map()方法之后&#xff0c;reduce()方法之前&#xff0c;中间这段汇洗的过…

Web前端大作业制作个人网页(html+css+javascript)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

功能强大UI美观的视频答题猜歌闯关娱乐微信小程序源码下载

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 这是一款拥有后端的闯关娱乐小程序 支持个人小程序和企业小程序上线运营 功能强大齐全,带数据本地化 (数据在自己服务器自己管理无需担心第三方失效的问题) 支持看视频答题闯关 支持…

Java多线程处理笔记

学习视频:598-JavaSE进阶-多线程概述_哔哩哔哩_bilibili 目录 多线程概述 进程和线程的关系 多线程并发的理解 分析程序存在几个线程 实现线程的第一种方式 实现线程的第二种方式 采用匿名内部类的方式 线程生命周期 获取线程的名字 获取当前线程对象 线程的sleep方法 …

Spring Cloud Stream 结合rocketmq

Spring Cloud Stream 结合rocketmq 官方网址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/RocketMQ 你可以在这个地址上下载到相关示例项目&#xff0c;配置项等相关信息 spring-cloud-stream 文档&#xff08;这个地址似乎只有集合kafaka和rabbit的示…

Akka 学习(六)Actor的监督机制

目录一 监督机制1.1 错误隔离性1.2 系统冗余性1.3 Actor的监督1.3.1 监督体系1.3.2 理解1,3.3 监督策越一 监督机制 1.1 错误隔离性 在学习Akka如何对失败情况进行响应之前&#xff0c;先了解一些在分布式应用程序中都应该遵循的通用策略&#xff1a;隔离错误。假设每个组件都…

【刷题-数组篇】狂刷力扣三十题,“数组”嘎嘎乱写 | 2022 12-5到12-9

前言 &#xff08;12月5日&#xff09;突然想起了很久以前别人&#xff08;具体来源已经记不清了&#xff09;传给我的一套题单。网上的题单不少&#xff0c;光收藏可不行&#xff0c;关键还得下手。 这套题单的题目数量为300出头&#xff0c;什么时候刷完我还没有明确计划&a…

web前端大作业 (仿英雄联盟网站制作HTML+CSS+JavaScript) 学生dreamweaver网页设计作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

2.IOC之xml配置

1.使用IDEA创建工程 2.引入项目使用的依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency> </depe…

英文外链代发怎么做有效果?英文外链购买平台

英文外链代发怎么做有效果&#xff1f; 答案是&#xff1a;选择权重较好的GPB外链 我们首先要知道一个观点&#xff0c;什么样的外链才有效果&#xff1f; 1.英文外链网站的有一定的权重&#xff0c;可高可低&#xff0c;但一定要有权重&#xff0c;数值指标可以参考MOZ的Do…