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

news2024/11/25 6:58:53

目录

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.coloradmin.cn/o/1531432.html

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

相关文章

canoe 以太网配置

canoe vn5620 以太网配置 首先电脑连接上VN5620&#xff0c;配置了License才能进行端口设置 从开始菜单中打开Vector Hardware Configuration 进入到配置页面&#xff0c;会出现VN5620&#xff0c;选择进行右击&#xff0c;点击第一个选项Ethernet device configuration ca…

Open World Object Detection in the Era of Foundation Models

Open World Object Detection in the Era of Foundation Models 摘要介绍相关工作开放词汇物体检测开放世界目标检测类无关的目标检测3.真实世界目标检测基准3.1 数据集细节3.2 基准架构3.3 什么是一个未知对象4. 利用基准模型用于开放世界目标检测4.1 背景4.2 属性生成4.3 属性…

SD3刚发布不久,最新的SD3-Turbo就来了:只需要4步就能超过MidjourneyV6!

StabilityAI刚刚发布了SD3-Turbo的论文&#xff1a;Fast High-Resolution Image Synthesis with Latent Adversarial Diffusion Distillation。 SD3-Turbo采用了一种新的蒸馏方法&#xff1a;Latent Adversarial Diffusion Distillation (LADD)&#xff0c;与基于像素的ADD&am…

elment-ui el-tabs组件 每次点击后 created方法都会执行2次

先看错误的 日志打印: 错误的代码如下: 正确的日志打印: 正确的代码如下: 前言: 在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if 来进行…

HarmonyOS NEXT应用开发之左右拖动切换图片效果案例

介绍 本示例使用滑动手势监听&#xff0c;实时调整左右两侧内容显示区域大小和效果。通过绑定gesture事件中的PanGesture平移手势&#xff0c;实时获取拖动距离。当拖动时&#xff0c;实时地调节左右两个Image组件的宽度&#xff0c;从而成功实现左右拖动切换图片效果的功能。…

python接口自动化测试数据和代码分离解析

common中存放的是整个项目中公共使用的封装方法 从工程目录上可以看到区分 datas中专门存放测试数据(yml文件) cases中专门集中存放测试用例 ... 数据分离的第一步先找到工程项目路径 1 2 3 4 5 6 7 8 9 10 11 12 # -*- encoding: utf-8 -*- """ __Software…

通过docker容器安装zabbix6.4.12图文详解(监控服务器docker容器)

目录 一、相关环境及镜像二、zabbix-server服务端部署1.使用docker创建zabbix-server服务端(1). 创建专用于Zabbix组件容器的网络(2). 启动空的MySQL服务器实例(3). 启动Zabbix Java网关实例(4). 启动Zabbix服务器实例并将实例与创建的MySQL服务器实例链接(5). 启动Zabbix Web界…

深入理解Ubuntu22:探索Linux操作系统的功能与应用

一、linux &#xff08;一&#xff09;、安装 1、电脑可以安装双系统&#xff0c;即在一套硬件上只能同时运行一个操作系统&#xff0c;例&#xff1a;C盘安装win&#xff0c;D盘安装linux。 2、虚拟机 虚拟机需要硬件支持&#xff0c;并需开启VT-x. 如&#xff1a;Virtual…

华为OD机试真题-推荐多样性-2024年OD统一考试(C卷)

题目描述: 推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略: 1. 各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列表中为每屏选择一个元素,依次类推 2. 每个列表的元素尽量均…

②免费AI软件开发工具测评:通义灵码 VS 码上飞

前言 我又双叒叕来测评了&#xff01;上次给大家带来的是iFlyCode和CodeFlying两款产品的测评&#xff0c;受到了大家的一致好评~ 今天咱就继续来聊聊&#xff0c;这次我们选的的对象是通义灵码和码上飞&#xff0c;从名字上也能看到出来这两款产品一定是跟软件开发有关系的&…

【c++】c++背景(c++的前世今生)

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. 什么是C 2. C发展史 3. C的重要性 3.1 语言的使用广泛度 3.2在工作邻域 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. …

模型部署——RKNN模型量化精度分析及混合量化提高精度

模型部署——RKNN模型量化精度分析及混合量化提高精度&#xff08;附代码&#xff09;-CSDN博客 3.1 量化精度分析流程 计算不同情况下&#xff0c;同一层网络输入值的余弦距离&#xff0c;来近似的查看每一层精度损失的情况。具体量化精度分析的流程如下&#xff1a; 3.2 量…

【好用】Star超36.8k,一个的免费通用数据库管理工具

关于数据库管理工具&#xff0c;大家可能都在用SQLyog、Navicat、MySQL-Front、SQL Studio、MySQL Workbench等等&#xff0c;这些管理工具不是不好用&#xff0c;就是要变魔术才可以用&#xff0c;今天 V 哥给大家推荐一个即好用&#xff0c;又免费的可视化通用数据库管理工具…

对JS文件进行压缩未通过,对WXML文件进行压缩未通过 问题解决

问题描述 在使用uniapp 开发微信小程序&#xff0c;进行上架发布时 代码质量栏 出现对JS文件进行压缩未通过&#xff0c;对WXML文件进行压缩未通过 问题。 虽然现实代码上传成功&#xff0c;但是作为一个合格的猿人&#xff0c;肯定是要解决的。那么如何解决呢&#xff1f; …

java-ssm-jsp基于javaweb的宠物猫狗商业系统

java-ssm-jsp基于javaweb的宠物猫狗商业系统 获取源码——》公主号&#xff1a;计算机专业毕设大全 获取源码——》公主号&#xff1a;计算机专业毕设大全

PMP备考心得 | 策略与技巧大揭秘

1.理解考试大纲&#xff1a;首先&#xff0c;你需要熟悉PMP考试的内容和结构。PMI官网提供了详细的考试大纲&#xff0c;包括项目管理的五个过程组&#xff08;启动、规划、执行、监控、收尾&#xff09;和十个知识领域&#xff1b; 2.制定学习计划&#xff1a;根据个人的时间…

【Leetcode-73.矩阵置零】

题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

白嫖阿里云程序员日历

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordId44f3187f7950776f494eec668a62c65f#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 打开链接直接领就行了

基于springboot的社区服务系统的设计与实现

一、系统架构 前端&#xff1a;vuex3 | element-ui 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 管理后台-登录 02. 管理后台-首页 03. 管理后台-用户管理 04. 管理后台-业主缴费管理…

编程语言那么多,为什么偏偏是C语言成了大学的必修课?

编程语言那么多&#xff0c;为什么偏偏是C语言成了大学的必修课&#xff1f; 必修JAVA? c#不服 必修Python? JAVA不服 甚至你必修到一半&#xff0c;Python落伍了都有可能。 当年我们还以必修JAVA&#xff0c;JSP为主要论点&#xff0c;然而刚过两年&#xff0c;JSP就成古…