memcpy 和 memmove的模拟实现

news2024/10/7 2:19:50

文章目录

1.函数的介绍

2.模拟实现

文章内容

1.函数的介绍

memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void*dest,void*src, size_t count);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源src中拷贝n个字节到目标dest中。

参数

  • dest-- 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。

  • src-- 指向要复制的数据源,类型强制转换为 void* 指针。

  • count-- 要被复制的字节数。

使用void* 类型的指针和字节为单位的要复制的数目,便于对多种类型函数的拷贝。

应用说明

1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。

2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

strcpy和memcpy主要有以下3方面的区别

1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。

2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。

  memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

原型:void *memmove( void* dest, const void* src, size_t count );

 参数部分和应用说明 与memcpy相似,不做过多介绍。

 

以上引自 memcpy_百度百科  memcpy - C++ Reference

2.模拟实现

1.我们使用的是void*类型的指针来接受的,但是我们 size_t count部分的单位是字节,所以我们要在循环当中先强制转换成(char*)类型的,之后再将arr1和arr2 ++,强制转换并不是永久的,所以每次都要转

2. 我们这里是传址,改变了实参的内容,arr2内容被改变了。

#include <stdio.h>
#include <string.h>
#include <assert.h>

void* my_memcpy(void* arr2, void* arr1, size_t count)
{
	assert(arr1 && arr2);
	void* ret = arr2;
	while (count--)
	{
		*(char*)arr2 = *(char*)arr1;
		arr1 = (char*)arr1 + 1;
		arr2 = (char*)arr2 + 1;
	}
	return ret;
}


int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr2[30] = { 0 };

	my_memcpy(arr2,arr1+3,20);

  //	my_mommove(arr1+3, arr1 , 20);

	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr2[i]);
	}

	return 0;
}

memove

当我们用自己的my_memcpy时,在同一个字符串内部拷贝时,会出现一下问题,

  这里并没有,将红色部分移到蓝色部分去,而是发生了重叠,

  为了解决这种问题,按照下面这种方式来,就不会发生重叠了

 当目标区域和源区域又重合的时候我们分为两种情况

1.当dest地址< src地址时 我们采用从前向后拷贝

2.当dest地址> src地址时 我们采用从后向前拷贝

没有重复就是随便拷贝。

void* my_mommove(void* dest, void* src, size_t count)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//前 —— 后
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);

		}

	}
	return ret;
}

int main()
{
	int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr2[30] = { 0 };

//	my_memcpy(arr1+3,arr1,20);

 	my_mommove(arr1+3, arr1 , 20);

	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < 10; i++)
	{
		printf("%d\n", arr1[i]);
	}
	return 0;
}

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

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

相关文章

内网穿透(NAT 穿透)原理+工具(部分无需管理员权限)

内网穿透&#xff0c;即 NAT&#xff08;Network Address Translation&#xff09; 穿透 内网穿透的实质是内网映射&#xff0c;内网地址转换成外网地址的实现。实现过程要有端对端数据传输&#xff0c;也有端口转发原理。内网映射方式&#xff0c;可以解决无公网IP问题&#…

Android问题笔记-Android studio 出现Failed to compile values file.错误

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

docker compose 容器编排工具

目录 docker compose是什么&#xff1f; 官网网站&#xff1a;Docker Compose overview | Docker Documentation 安装使用compose&#xff1a; 步骤&#xff1a; 1、下载并安装compose的命令行插件 2、安装完成后授予权限&#xff0c;测试compose是否可以使用 3、实例测试…

AI大模型迈入应用时代,每日互动推动“可控大模型”落地

垂直行业更需要可控大模型 当下&#xff0c;大模型正在不断精进&#xff0c;以GPT-4、文心一言为代表的大模型&#xff08;LLM&#xff09;表现出了强大的逻辑推理能力&#xff0c;并能够很好地处理复杂任务&#xff0c;使得社会生产力得到了飞跃式提升。 面对大模型热度的持…

全网最详细,自动化测试与自动化框架总结,你不知道的都在这了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 单元测试框架 单…

网络:IP地址、子网掩码、网络地址、广播地址、网段、网关

目录 一、IP地址 二、子网掩码 三、网络地址 四、广播地址 五、网段 六、网关 七、IP地址、子网掩码、网络地址、广指地址、网殷、网关的关系 参考链接 一、IP地址 IP地址是因特网协议&#xff08;IP&#xff09;中使用的一种数字标识符&#xff0c;用于唯一地标识网络…

LLM - 基于 Vicuna-13B 参数计算搭建私有 ChatGPT 在线聊天

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131312366 LLaMA 和 Vicuna 都是大语言模型(LLM)&#xff0c;两者的差异如下&#xff1a; LLaMA (Large Language Model Meta AI)&#…

英飞凌MCU芯片选型推荐参考

前言: 英飞凌Infineon作为一家芯片大厂,有众多芯片产品可供选型,这里重点推荐下庞大的MCU系列如何选项。首先,对于英飞凌产品构成要有深刻的认识,需要熟悉一个半导体产业并购的历程。2013年5月,Spansion 1.1亿美元并购了对富士通(Fujitsu)半导体微控制器和模拟业务部门…

聚类Clustering方法定位船舶站点

背景 现有船舶的航线中采样的数据库&#xff0c;采样的总时长为3个月&#xff0c;仅采样航速静止&#xff08;小于1节&#xff09;的数据&#xff0c;关键有效数据主要有经纬度/实时吃水量。 思路 基于站点附近轮船有停靠且航行速度慢&#xff0c;故取样点多的基础认识&…

正确的认识泥石流以及做好泥石流的防范

泥石流是山区沟谷中由暴雨、冰雪融水或地下含水层的渗入所形成的携带大量泥沙、石块等固体物质的特殊洪流&#xff0c;具有流量大、历时短、破坏力强等特征&#xff0c;泥石流携带的泥沙、石块等可高达数十米&#xff0c;并从山坡上倾泻而下&#xff0c;往往会形成一个“堰塞湖…

Python自动化测试利器selenium详解

Selenium是一种常用的Web自动化测试工具&#xff0c;支持多种编程语言和多种浏览器&#xff0c;可以模拟用户的交互行为&#xff0c;自动化地执行测试用例和生成测试报告。Selenium基于浏览器驱动实现&#xff0c;结合多种定位元素的方法&#xff0c;可以实现各种复杂的Web应用…

二进制搭建Kubernetes集群(一)——部署etcd集群和单master

单master集群架构图&#xff1a; 实验环境&#xff08;二进制搭建 Kubernetes v1.20&#xff09; 注意&#xff1a;生产环境中&#xff0c;etcd集群和master、node节点都应该部署在不同的机器上&#xff0c;此处为了实验方便&#xff0c;将三台etcd节点分别部署在了master和no…

探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路

我们会基本使用显然不够啊 我们要去了解mustache的原理 乃至自己去写一个mustache 首先 mustache 不是不能用简单的正则表达式来实现 但是 这里为了让大家理解 为什么不能 我们还是用简单正则写一下 我们创建一个 html文件 然后 编写代码如下 <!DOCTYPE html> <htm…

API性能监控 【ApiHelp】-- 组件Monitor 核心功能实现

上篇文章介绍了组件Monitor主要设计和功能Monitor组件设计&#xff0c;现在来具体看看Monitor组件的实现。 1、Java Agent实现AgentMain 前面已经介绍了Java Agent相关知识&#xff0c;现在来具体实现下。 实现AgentMain类&#xff1a; AgentMain为agent的入口类&#xff0c;程…

【C语言】项目实战——快速0基础上手五子棋游戏(内附源码)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 如果你是从现在关注的老粉的话&#xff0c;你可能会有点疑惑“how old are you&#xff1f;”(怎么老是你&#xff1f;) 唉&#xff0c;没办法我也不想的&#xff0c;但是月末了参加新星计划和2023年博客之星的评选只能更…

职业生涯规划书600字范文

职业生涯规划书600字范文篇1 记得高中时老师就告诉我们要认识自己&#xff0c;“认识自己”&#xff0c;仅仅四个字&#xff0c;实践起来是何等的艰难&#xff0c;古往今来那么多仁人志士为了能认识自己&#xff0c;不断实践&#xff0c;不断创新&#xff0c;可又有几个能在生命…

软件安全技术复习内容

软件安全技术 边复习边写的&#xff0c;有错误及时指正第一章 软件安全概述零日漏洞安全威胁分类CIA安全基本属性PDRR模型软件安全的主要方法和技术基本方法主要技术 第二章 软件漏洞概述概念软件漏洞成因分析软件漏洞分类基于漏洞成因的分类基于漏洞利用位置的分类基于威胁类型…

FPGA基础知识-编程语言接口

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.PLI的使用 2.PLI任务的连接和调用 3.内部数据的获取 4.PLI库子程序 学习时间&#xff1a; 学习产出&#xff1a; 学习目标&#xff1a; 解释在Verilog仿真中如何使用PLI子程序。 描述PLI的用途。 定义用户自定义系…

DSIN(Deep Session Interest Network)详解

1. 提出动机 这个模型依然是研究如何更好地从用户的历史行为中捕捉到用户的动态兴趣演化规律。DIEN存在一个问题&#xff0c;就是只关注了如何去改进网络&#xff0c;而忽略了用户历史行为序列本身的特点&#xff0c;我们仔细去想&#xff0c;用户过去可能有很多历史点击行为&…

kafka硬件选择以及如何在生产中优化各个组件的参数

硬件选择&#xff1a; 1.求出一天kafka会产出大概多少的消息&#xff0c;然后平均到每一秒&#xff0c;要多少的消息&#xff0c;然后一条消息大概就是0.5-2k的大小&#xff0c;求出&#xff0c;每秒占用多少内存 2.求购买服务器数量(上边求出的效率 * 副本数/100)1 如果除不…