C语言-内存函数详解

文章目录

    • 1. memcpy使用和模拟实现
    • 2. memmove使用和模拟实现
    • 3. memset函数的使用
    • 4. memcmp函数的使用


1. memcpy使用和模拟实现

返回类型和参数:

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

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3. 如果source和destination有任何的重叠,复制的结果都是未定义的。
4.注意单位是字节
5.头文件:#include<string.h>

memcpy使用:

int main() {
	int arr[20] = { 0 };//目标数组
	int arr1[] = { 1,2,3,4,5 };//源数组
	memcpy(arr, arr1, 20);//20单位是字节
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

memcpy模拟实现

1.我们创建一个返回类型和参数于memcpy函数相同的函数
2.因为memcpy函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.通过循环来拷贝

代码实现:

void* mn_memcpy(void* p1, const void* p2, size_t n) {
	assert(p1);//判断是否为空指针,参数和类型memcpy一样
	assert(p2);
	while (n) {//控制拷贝多少个字节
		*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)
			((char*)p1)++; 
			((char*)p2)++;
		n--;//
	}
}
int main() {
	int arr[20] = { 0 };
	int arr1[] = { 1,2,3,4,5 };
	mn_memcpy(arr, arr1, 20);
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述

2. memmove使用和模拟实现

返回类型和参数:

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

1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2. 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
3. 单位是字节
4. 头文件:#include<string.h>

memmove 使用:

 int main() {
	int arr1[] = { 1,2,3,4,5 };
	memmove(arr1+1, arr1, 3*sizeof(int));
	for (int i = 0; i < 5; i++) {//拷贝完打印
		printf("%d ", arr1[i]);
	}
	return 0;
}

运行结果:
在这里插入图片描述
memmove模拟:

1.我们创建一个返回类型和参数于memmove函数相同的函数
2.因为memmove函数拷贝的单位是字节,所以我们在拷贝是将类型转化为(char*)类型
3.我们要分三种情况考虑,再通过循环拷贝

三种情况:
在这里插入图片描述

代码实现:

void* mn_memmove(void* p1, const void* p2, size_t n) {
	assert(p1);//判断是否为NULL
	assert(p2);
	if (p1 <= p2 || (char*)p1 >= (char*)p2 + n)//包含两种情况,直接按顺序拷贝
	{
		while (n) {
			*((char*)p1) = *((char*)p2);//将void*转化为char*(一字节)
						((char*)p1)++; //(char*)p1加加,字节加一
						((char*)p2)++;
					n--;
		}
	}
	else {//第三种情况 倒序拷贝
		p1 = (char*)p1 + n - 1;
		p2 = (char*)p2 + n - 1;
		while (n) {
			*((char*)p1) = *((char*)p2);
			((char*)p1)--;
			((char*)p2)--;
			n--;

		}
	}
}
int main() {
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	mn_memmove(arr1+1, arr1, 3*sizeof(int));
	for (int i = 0; i < 10; i++) {//拷贝完打印
		printf("%d ", arr1[i]);
	}
	return 0;}

运行结果:
在这里插入图片描述

3. memset函数的使用

返回类型和参数

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

1.memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
2. 头文件:#include<string.h>

使用:

int main() {
	char arr[] = "qwert";
	memset(arr, '0', 3 * sizeof(char));
	printf("%s", arr);
	return 0;
}

运行结果:
在这里插入图片描述

4. memcmp函数的使用

返回类型和参数:

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

1.比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
2. 头文件:#include<string.h>

返回值:
在这里插入图片描述
使用:

int main() {
	char arr[] = "qwert";
	char arr1[] = "abcdf";
	if (memcmp(arr, arr1))
		printf("arr>arr1");
	else
		printf("arr1>arr");
	return 0;
}

运行结果:
在这里插入图片描述

以上就是我的分享了,如果有什么错误,欢迎在评论区留言。
最后,谢谢大家的观看!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

叠加原理(superposition principle)、线性系统

叠加原理&#xff08;superposition principle&#xff09;&#xff1a;指对一个系统而言&#xff0c;两个或多个输入产生的输出&#xff0c;等于这几个输入单独引起的输出的和&#xff0c;即输入的叠加等于各输入单独引起的输出的叠加。 线性系统&#xff1a;一个系统&#x…

Java毕业设计 SpringBoot 车辆充电桩系统

Java毕业设计 SpringBoot 车辆充电桩系统 SpringBoot 车辆充电桩系统 功能介绍 首页 图片轮播 登录注册 充电桩展示 搜索充电桩 充电桩报修 充电常识 个人中心 我的收藏 后台管理 登录 首页 个人中心 维修员管理 用户管理 电桩类别管理 充电桩管理 充电桩报修管理 维修回复管…

B树与B+树的对比

B树&#xff1a; m阶B树的核心特性&#xff1a; 树中每个节点至多有m棵子树&#xff0c;即至多含有m-1个关键字根节点的子树数属于[2, m]&#xff0c;关键字数属于[1, m-1]&#xff0c;其他节点的子树数属于 [ ⌈ m 2 ⌉ , m ] [\lceil \frac{m}{2}\rceil, m] [⌈2m​⌉,m]&am…

机器学习:攻击方法FGSM系列

任务 FGSM I-FGSM MI-FGSM Ensemble Attack 攻击评价指标 准确率越低表明攻击越好 数据 预训练模型 BaseLine 实践

Java、PHP、C语言经典项目源码合集推荐(一)

&#xff08;一&#xff09;.Java智慧校园系统源码、 智慧学校源码、 智慧校园平台源码、智慧校园电子班牌系统源码、中小学智慧校园系统源码、 原生微信小程序端源码、电子班牌系统源码 项目技术栈 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程…

UWB实时定位系统源码,历史活动轨迹显示,视频联动,电子围栏

UWB实时定位系统源码&#xff0c;工厂企业人员安全定位&#xff0c;UWB源码 行业背景 工业企业多存在很多有毒有害、高危高压等生产环境&#xff0c;带电设备众多&#xff0c;容易发生安全事故&#xff1b;人员只能凭记忆遵守各项生产安全规范&#xff0c;如某些危险区域范围、…

运维 | 浅谈云计算的相关概念和分类

关注&#xff1a;CodingTechWork 云计算 云计算的出现 云计算是采用的按需付费的方式&#xff0c;通过互联网访问云服务器上的服务器、数据库等服务。云计算为何会出现&#xff1f;  如果现在一个企业想要进行软件管理部署&#xff0c;首先需要服务器主机和网络规划&#…

手把手教你如何在Linux下写进度条小程序(附源码)

效果展示 录屏2023 一、建立文件 mkdir ProgressBar //在当前目录下&#xff0c;建立新的目录 cd ProgressBar //进入这个目录 touch main.c makefile progressbar.c progressbar.h //在ProgressBar这个目录建立这几个文件进入ProgressBar这个目录之后&#xff0c;使…

【开源】基于Vue和SpringBoot的食品生产管理系统

项目编号&#xff1a; S 044 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S044&#xff0c;文末获取源码。} 项目编号&#xff1a;S044&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3…

过滤器的应用

javaWeb三剑客: 1. Servlet:接收请求,处理请求(单例,也就是说&#xff0c;多个用户请求的的servlet是同一个对象) 2. Filter:拦截请求(单例->也就是说&#xff0c;多个用户请求的的filter是同一个对象) 3. Listem: 监听用户/服务器行为,javaWeb三剑客: 过滤器的实现 1&…

Arrays.asList() 与 Collections.singletonList()的恩怨情仇

1. 概述 列表是我们使用 Java 时常用的集合类型。 众所周知&#xff0c;我们可以轻松地用一行初始化一个List。例如&#xff0c;当我们想要初始化一个只有一个元素的List时&#xff0c;我们可以使用Arrays.asList()方法或Collections.singletonList()方法。 在本文中&#x…

HCIP-十、BGP基础

十、BGP基础 实验拓扑实验需求及解法1.R1 属于 AS100&#xff0c;R2/3/4 属于 AS200&#xff0c;R5 属于 AS3002.AS200 内运行 OSPF3.建立 IBGP 邻居4.建立 EBGP 邻居5.BGP 发布路由6.路由黑洞 实验拓扑 实验需求及解法 本实验模拟 ISP 网络拓扑&#xff0c;运行 BGP。如图所示…

【DevOps】基于 KubeSphere 的 Kubernetes 生产实践之旅(万字长文)

基于 KubeSphere 的 Kubernetes 生产实践 1.KubeSphere 简介1.1 全栈的 Kubernetes 容器云 PaaS 解决方案1.2 选型理由&#xff08;从运维的角度考虑&#xff09; 2.部署架构图3.节点规划3.1 软件版本3.2 规划说明3.2.1 K8s 集群规划3.2.2 存储集群3.2.3 中间件集群3.2.4 网络规…

kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性

文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么&#xff1f;性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失&#xff1f;Kafka 的架构说一下&#xff1f;Kafka 怎么保证消息是有序的&#xff1f;Kafka 怎么解决重复消费&#xff1f;Kafka 怎么保证消息不丢失…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

spring boot整合Jasypt实现配置加密

文章目录 目录 文章目录 前言 一、Jasypt是什么&#xff1f; 二、使用步骤 1.引入 2.测试使用 3.结果 总结 前言 一、Jasypt是什么&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#xff0c;提供了一种简单的加密解密方式&#xff0c…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目&#xff0c;网页显示如下&#xff0c;需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null&#xff0c;则执行下面的逻辑。在下面的…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功&#xff0c;其中有几个关键问题需要解决&#xff1a; 全表筛选&#xff0c;或者说多列搜索中文排序…

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊&#xff01;小米在这里&#xff5e; 很高兴又有机会和大家见面啦&#xff01;最近小米参加了一场腾讯的运营面试&#xff0c;遇到了一个超有趣的问题&#xff1a;如果让你运营一个公众号&#xff0c;近期需要增加1000个关注&#xff0c;预算100元&#xff0c;怎么完成…

RocketMq 主题(TOPIC)生产级应用

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…