(C语言)memcpy函数详解与模拟实现

目录

1. memcpy函数详解

情况一:

情况二:

情况三:

情况四:

情况五:

2. memcpy模拟实现

2.1 重叠情况的讨论:

2.2 memcpy函数超出我们的预期


1. memcpy函数详解

头文件<string.h>

这个函数和memcpy有点像,但是它是以字节为单位完成复制的num是要复制的字节数,destination是要复制到的地址,source是数据来源的地址。返回的是destination。函数遇到\0并不会停下。

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

示例

情况一:

将arr1中两个字节大小的数据拷贝到arr1中,因此arr1中的“ab”被拷贝到arr2中。

情况二:

我们可以看到拷贝时遇到arr1中的\0时没有停止拷贝,而是继续拷贝直到拷贝完5个字节的长度。

情况三:

可以看到拷贝完成后不会在arr2后面补上\0。

情况四:

若arr1的大小不足要拷贝的大小,那么会将arr1外面的数据拷过来,产生危险,因此在使用时要考虑好大小关系。

情况五:

若arr2的大小小于要拷贝的的小,在运行时会报警告,表示arr2周围的堆栈以损坏。我们使用时要避免这样。

2. memcpy模拟实现

#include <assert.h>
void* my_memcpy(void* dest, const void* sour, size_t num)
{
	void* p = dest;
	assert(dest && sour);
	while (num)
	{
		*(char*)dest = *(char*)sour;
		((char*)dest)++;
		((char*)sour)++;
		num--;
	}
	return p;
}

因为要实现多种类型的拷贝所以接收参数是void*类型,可以接收任何类型的地址,函数内强制类型转换,进行一个一个字节的拷贝,这样就可以拷贝多种类型数组了。

下面我们来使用以下my_memcpy函数:

运行结果:

可见我们的代码实现了拷贝,函数模拟实现完成。

2.1 重叠情况的讨论:

若destination与source有重叠的部分会怎么样呢?

运行一下:

我们预期的输出结果是:1 2 1 2 3 4 5 6 7 8。但实际与我们的预期截然不同,这是为什么呢?

想一想,arr1+2,会从第三个元素开始覆盖,覆盖时arr1自身会改变,当source向后找时会遇到前面刚复制过去的‘1’与‘2’会再次向后复制,因此会产生这种效果。

2.2 memcpy函数超出我们的预期

我们再来看一下库函数的执行结果是:

我们前面不是说:如果source和destination有任何的重叠 ,复制的结果都是未定义的。

其实库函数的实现超出了我们的预期,虽然它可以完成数据有重叠时的拷贝但是我们还是要使用memmove()函数;他可以完美处理这种重叠情况。

在下一篇博客我将详解memmove函数并完成其模拟实现。。。。

感谢观看,欢迎在评论区讨论

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

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

相关文章

腾讯云服务器多少钱一个月?5元1个月,这价格没谁了

2024腾讯云服务器多少钱一个月&#xff1f;5元1个月起&#xff0c;腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月&#xff0c;8核32G22M配置115元一个月、345元3个月&#xff0c;腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

C++ Qt开发:QUdpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的网络通信…

网站引用图片但它域名被墙了或者它有防盗链,我们想引用但又不能显示,本文附详细的解决方案非常简单!

最好的办法就是直接读取图片文件&#xff0c;用到php中一个常用的函数file_get_contents(图片地址)&#xff0c;意思是读取远程的一张图片&#xff0c;在输出就完事。非常简单&#xff5e;话不多说&#xff0c;直接上代码 <?php header("Content-type: image/jpeg&quo…

“小白也能玩转!ES集群搭建零报错全攻略,轻松上手指南!”

&#x1f310; 全新的“Open开袁”官方网站现已上线&#xff01;https://open-yuan.com&#xff0c;汇聚编程资源、深度技术文章及开源项目地址&#xff0c;助您探索技术新境界。 &#x1f4f1; 关注微信公众号“全栈小袁”&#xff0c;随时掌握最新项目动态和技术分享&#xf…

2024地方门户源码运营版带圈子动态+加即时通讯(PC电脑端+WAP移动端+H5微信端+微信小程序+APP客户端)

2024地方门户源码运营版带圈子动态加即时通讯&#xff08;PC电脑端WAP移动端H5微信端微信小程序APP客户端&#xff09; 源码介绍&#xff1a; 包含5个端 PC电脑端WAP移动端H5微信端微信小程序APP客户端 功能介绍&#xff1a; 包含功能&#xff1a;信息资讯、二手信息、房产…

docker入门(四)—— docker常用命令详解

docker 常用命令 基本命令 # 查看 docker 版本 docker version # 查看一些 docker 的详细信息 docker info 帮助命令&#xff08;–help&#xff09;&#xff0c;linux必须要会看帮助文档 docker --help[rootiZbp15293q8kgzhur7n6kvZ /]# docker --helpUsage: docker [OPTI…

Grok ai——很牛叉的ai工具Grok-1大模型

Grok Grok 是一款仿照《银河系漫游指南》&#xff08;Hitchhikers Guide to the Galaxy&#xff09;设计的人工智能。它可以回答几乎任何问题&#xff0c;更难的是&#xff0c;它甚至可以建议你问什么问题&#xff01; Grok 是一个仿照《银河系漫游指南》设计的人工智能&#x…

数据结构:详解【顺序表】的实现

1. 顺序表的定义 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。动态顺序表与数组的本质区别是——根据需要动态的开辟空间大小。 2. 顺序表的功能 动态顺序表的功能一般有如下几个&#xff1a; 初始化顺序表打印顺序…

计算机组成原理-3-系统总线

3. 系统总线 文章目录 3. 系统总线3.1 总线的基本概念3.2 总线的分类3.3 总线特性及性能指标3.4 总线结构3.5 总线控制3.5.1 总线判优控制3.5.2 总线通信控制 本笔记参考哈工大刘宏伟老师的MOOC《计算机组成原理&#xff08;上&#xff09;_哈尔滨工业大学》、《计算机组成原理…

spring suite搭建springboot操作

一、前言 有时候久了没开新项目了&#xff0c;重新开发一个新项目&#xff0c;搭建springboot的过程都有点淡忘了&#xff0c;所有温故知新。 二、搭建步骤 从0开始搭建springboot 1&#xff0e;创建work空间。步骤FileNewJava Working Set。 2.选择Java Working Set。 3.自…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论&#xff1a; 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

OPTEE v3.20.0 FVP环境搭建

目录 一、前提条件 二、下载fvp代码 三、下载工具链 四、下载Foundation_Platform FVP平台 五、编译及运行 一、前提条件 1、安装如下的依赖工具 sudo apt-get install android-tools-adb android-tools-fastboot autoconf \ automake bc bison build-essential ccache c…

2024精灵传信系统支持电脑PC端+小程序双端源码

2024精灵传信系统支持电脑PC端小程序双端源码 精灵传信支持在线提交发送短信&#xff0c;查看回复短信&#xff0c;在线购买额度&#xff0c;自定义对接易支付&#xff0c;设置违禁词&#xff0c;支持网站小程序双端。 搭建环境&#xff1a; PHP > 73 MySQL>5.6 Nginx…

当两会热词碰上“人工智能+”,你知道哪些企业算是行业弄潮儿吗?

最近正值全国“两会”的召开&#xff0c;一大批新词热词涌现&#xff0c;聚焦了各行各业的发展&#xff0c;也一定程度上代表了未来的主要发展方向。“未来产业”、“人工智能”、“全国一体化算力体系”等热词的出圈充分表明了信息技术行业是一大发展重点&#xff0c;尤其是人…

护航容器安全:私有Registry在镜像审核中的关键角色与实战策略

在容器化技术日益普及的今天&#xff0c;Docker镜像的质量与安全性成为了构建稳定、可靠应用的关键要素。私有Registry作为镜像的集中存储和分发中心&#xff0c;不仅可以提供镜像的统一管理&#xff0c;还能通过集成镜像审核机制&#xff0c;确保进入生产环境的镜像符合安全与…

如何解决MySQL死锁(看懂MySQL锁日志)

有时候系统在生产运行着&#xff0c;会突然爆出 [40001][1213] Deadlock found when trying to get lock; try restarting transaction 这个时候每个人都会很紧张&#xff0c;因为死锁会影响DB性能&#xff0c;严重时甚至拖垮整个系统。在实际的环境中&#xff0c;很多服务会共…

【电路笔记】-达林顿晶体管

达林顿晶体管 文章目录 达林顿晶体管1、概述2、基本达林顿晶体管配置3、示例4、达林顿晶体管应用5、Sziklai 晶体管对6、ULN2003A 达林顿晶体管阵列7、总结两个双极晶体管的达林顿晶体管配置可针对给定基极电流提供更大的电流切换。 1、概述 达林顿晶体管以其发明者 Sidney Da…

文件包含漏洞之包含NGINX日志文件(常用)

条件&#xff1a;知道目标服务器的日志文件存贮路径&#xff0c;并且存在文件包含漏洞 首先对目标服务器发送一次含有木马的请求&#xff0c;目的是让目标服务器日志中生成含有木马的日志记录。因为发送过程中&#xff0c;使用了url编码&#xff0c;我们抓包进行更改成能够执行…

【Python爬虫】详解BeautifulSoup()及其方法

文章目录 &#x1f354;准备工作&#x1f339;BeautifulSoup()⭐代码实现✨打印标签里面的内容✨快速拿到一个标签里的属性✨打印整个文档&#x1f386;获取特定标签的特定内容 &#x1f339;查找标签&#x1f388;在文档查找标签 find_all&#x1f388;正则表达式搜索 &#x…

echarts geo地图加投影两种方法

方法1&#xff0c;geo中加多个地图图形&#xff0c;叠加。缩放时 可能会不一致&#xff0c;需要捕捉georoam事件&#xff0c;使下层的geo随着上层的geo一起缩放拖曳 geo: [{zlevel: 3,//geo显示级别&#xff0c;默认是0 【最顶层图形】map: BJ,//地图名roam: true,scaleLimit: …