memcpy内存拷贝函数

目录

一、memcpy内存拷贝函数

注意事项

二、memcpy与strcpy对比

三、模拟实现memcpy函数

四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝

五、改进my_memcpy函数


一、memcpy内存拷贝函数

头文件:string.h

函数原型:void* memcpy(void* destination , const void* source , size_t num)

函数作用:将源地址中num个字节的内容拷贝到目标地址中

参数分析:

void *是不指定具体类型指针,意味着该函数可以拷贝任意类型的数据

destination是目标地址,即将源地址的内容拷贝到目标地址中

source是源地址,为目标地址提供拷贝内容

num是拷贝多少个字节

实例代码1:两个数组空间的拷贝

char arr1[] = { 5,4,3,2,1 };
char arr2[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(arr2, arr1, sizeof(arr1[0]) * 5);for (int i = 0; i < 10; i++)
{printf("%d ", arr2[i]);
} 

实例代码2:destination和source不一定是数组,任意可读写的地址空间即可

char arr[20] = "abcdefg";
char* p = "123456789";
memcpy(arr + 2, p + 5, sizeof(char) * 4);printf("%s\n", arr);

注意事项:

1.拷贝时destination地址的空间需要足够大,至少大于等于num个字节

2.如果destination地址空间存在数据,将会被新数据覆盖

3.memcpy不能进行有内存重叠的两个地址的内存拷贝

二、memcpy与strcpy对比

memcpy是内存拷贝函数,strcpy是字符串拷贝函数

strcpy函数原型:char *strcpy(char *str1, const char *str2)

strcpy函数作用:将字符串str2中的内容拷贝到字符串str1中

对比memcpy函数:

1.memcpy函数逐字节拷贝,strcpy函数遍历str2时遇到\0即停止拷贝,并将\0也拷贝到str1中

2.memcpy函数可以拷贝任意类型数据,strcpy函数只能拷贝字符串

三、模拟实现memcpy函数

注意:优先级:后置++  >  强制类型转换,所以destination和source的强制类型转换需要加括号

void* my_memcpy(void* destination, const void* source, size_t num)
{if (destination == NULL || source == NULL){return NULL;}for (int i = 0; i < num; i++){*(char*)destination = *(char*)source;((char*)destination)++;((char*)source)++;}
}

实例代码:

char arr[] = "123456789";
memcpy(arr, arr + 5, 3);
printf("%s\n", arr);//678456789

四、memcpy函数不能进行两块存在内存重叠的空间的内存拷贝

VS改进后的memcpy函数可以进行内存重叠空间的拷贝:

C语言标准规定,memcpy函数不能进行两块有内存重叠的的空间的内存拷贝,但是在VS编译器下实际测试时,这是由于VS对memcpy函数进行了改进,使得其可以进行内存重叠的空间的拷贝。

char arr[] = "123456789";
memcpy(arr + 2, arr, 5);//121234589
printf("%s\n", arr);

模拟实现的my_memcpy函数不能进行内存重叠空间的拷贝:

但是当使用模拟实现的my_memcpy函数进行拷贝时,结果不尽人意……

结果并非预期的121234589,而是121212189

	char arr[] = "123456789";my_memcpy(arr + 2, arr, 5);//121234589printf("%s\n", arr);

原因分析:

这是因为在进行内存重叠的两块空间拷贝时,会发生未拷贝的被已拷贝的数据覆盖

例如:将源空间的12345,拷贝到目标空间的34567

当1、2拷贝到3、4的位置时,数组变为121256789,源空间需要拷贝的3、4被1、2覆盖,无法进行拷贝,只能再将1、2拷贝到目标空间,显然这是错误的

五、改进my_memcpy函数

解决上述问题,需要改进的my_memcpy函数的算法

将拷贝的类型分为两类:1.源空间在目标空间前  2.目标空间在源空间前

1.源空间在目标空间前

如下图,常规方法从前向后拷贝(1~3,2~4,……),需要改进为从后向前拷贝(5~7,4~6,……),这样被覆盖的数据已经拷贝完了 ,不影响后续的拷贝

2.目标空间在源空间前

如下图,需要从前向后拷贝(3~1,4~2,……)

总体原则:第一次拷贝的空间不能覆盖源空间

改进后的my_memcpy函数:

void* my_memcpy(void* destination, const void* source, size_t num)
{if (destination == NULL || source == NULL){return NULL;}if (source < destination)//从后向前拷贝{for (int i = num - 1; i >= 0; i--){*((char*)destination + i) = *((char*)source + i);}}else//从前向后拷贝{for (int i = 0; i < num; i++){*(char*)destination = *(char*)source;((char*)destination)++;((char*)source)++;}}
}

测试代码:

char arr[] = "123456789";
my_memcpy(arr + 2, arr, 5);//121234589
printf("%s\n", arr);

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element Plus el-form表单自定义插槽如何使用

//正常无插槽表单<el-form :model"form" label-width"120px"><el-form-item label"Activity name"><el-input v-model"form.name" /></el-form-item></el-form>//带插槽表单//适用二次封装的form组件&l…

.npmrc 使用详解

配置.npmrc之后需要&#xff1a; 清理项目目录中的 node _modules 目录(package-lock.json,umi)。清理 node cache: npm cache clear --force&#xff1b;{ 此步骤必须&#xff0c;主要是大家的电脑经过多年使用后&#xff0c;npm 配置比较混乱&#xff0c;为了避免或者减少配…

代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 视频讲解&#xff1a; https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%86%BB%E6%9C%9F.html &#xff08;1&#xff09;代码 714.买卖股票的最佳时机含手续费…

【微信小程序】无纸化会议OA系统之首页搭建

前言 中国政府意识到信息技术的重要性&#xff0c;并开始积极推动信息产业的发展。一系列政策和措施被制定和执行&#xff0c;以促进信息技术的采用和普及&#xff0c;从而推动数字化时代的到来。为了响应国家推行的数字化时代&#xff0c;本篇文章以会议OA系统为背景进行编写…

unity脚本_碰撞检测函数 c#

在项目创建一个脚本文件包新建脚本Cor 将以下代码复制 using UnityEngine; public class Cor : MonoBehaviour{ #region 碰撞检测函数 #endregion //至少一个刚体和两个碰撞器让两个游戏物体产生碰撞 //物理材质Phy Material让两个游戏物体之间表现不同效果 //…

性能测试基础知识及性能指标

前言&#xff1a;最近公司接了个项目&#xff0c;领导开会突然来了句&#xff0c;让我出一份性能测试方案&#xff0c;后面性能测试工作交给我&#xff01;我心里想之前面试没要求会这个啊&#xff08;最少得加钱才能做吧~&#xff0c;没办法既然下达了指令&#xff0c;那就只能…

代码随想录二刷 Day42

62.不同路径 简单题目自己就可以写出来&#xff0c;注意下创建二维vector的方法就可以&#xff0c; dp table如下 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));for (int i 0; i < n; i ) {dp[…

linux加密安全和时间同步

sudo实现授权 添加 vim /etc/sudoers luo ALL(root) /usr/bin/mount /deb/cdrom /mnt/ test ALL(root:ALL) ALL 在所有主机上 提权为root用户&#xff0c; 可以执行所有命令 户"test"被授权以"root"用户身份在任意主机上执行任意命令 切换luo用户使用 su…

协同过滤推荐算法UserCF、ItemCF

目录 相似度计算基于用户的协同过滤&#xff08;UserCF&#xff09;算法评估基于物品的协同过滤&#xff08;ItemCF&#xff09;协同过滤算法的权重改进协同过滤算法的问题分析思考学习参考 相似度计算 杰卡德&#xff08;Jaccard&#xff09;相似系数 Jaccard 系数是衡量两个…

AD9371 官方例程

文章目录 前言一、HDL方面1. ZYNQ 核根据ZCU106平台修改&#xff08;**参考UG1244 ZCU106 Evaluation Board**&#xff09;&#xff0c;尤其注意**DDR**的配置&#xff08;**参考美光 MTA4ATF51264HZ**&#xff09;2.dacfifo 深度 要修改 &#xff0c;地址位宽 小于等于16&…

【小黑嵌入式系统第二课】嵌入式系统的概述(二)——外围设备、处理器、ARM、操作系统

上一课&#xff1a; 【小黑嵌入式系统第一课】嵌入式系统的概述&#xff08;一&#xff09;——概念、特点、发展、应用 下一课&#xff1a; 【小黑嵌入式系统第三课】嵌入式系统硬件平台&#xff08;一&#xff09;——概述、总线、存储设备&#xff08;RAM&ROM&FLASH…

【周末闲谈】VR新视界,“眼”见未来

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 系列目录 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; ✨第二周 畅想AR 文章目录 系列目录前言虚拟现实(VR)技术虚拟现实技术的原理虚拟现实技术发…

自动驾驶的法律和伦理问题

随着自动驾驶技术的不断发展&#xff0c;出现了一系列与法律和伦理有关的问题。这些问题涵盖了自动驾驶的法律框架、道路规则以及伦理挑战。本文将探讨这些问题&#xff0c;并分析自动驾驶所带来的法律和伦理挑战。 自动驾驶的法律框架 自动驾驶的法律框架是制定和管理自动驾…

@Controller与@RestController

总结 Controller &#xff1a;定义一个控制器类. RequestMapping &#xff1a;给出外界访问方法的路径&#xff0c;或者说触发路径 &#xff0c;触发条件。 具体解析访问路径到某个方法上. ResponseBody &#xff1a;标记Controller类中的方法。把return的结果变成JSON对象…

Linux使用rpm包安装mysql5.7

以前安装过mysql 前言&#xff1a;检查以前是否装有mysql rpm -qa|grep -i mysql安装了会显示&#xff1a;   bt-mysql57-5.7.31-1.el7.x86_64 停止mysql服务和删除之前安装的mysql rpm -e bt-mysql57-5.7.31-1.el7.x86_64查找并删除mysql相关目录 find / -name mysql/va…

三江学院“火焰杯”软件测试高校就业选拔赛颁奖仪式

11月25日下午&#xff0c;“火焰杯”软件测试开发选拔赛及三江-慧科卓越工程师班暑期编程能力训练营颁奖仪式在s楼会议室隆重举行。计算机科学与工程学院院长刘亚军、副院长叶传标、曹阳、吴德、院党总支副书记王兰英、系主任杨少雄、慧科企业代表尹沁伊人、项目负责人王旭出席…

旅游业媒体套餐7个诀窍助你轻松实现销售目标-华媒舍

旅游业是一个竞争激烈的行业&#xff0c;成功营销对于吸引客户和实现销售目标至关重要。借助媒体资源是一种有效的方式。本文将介绍7个诀窍&#xff0c;借助旅游业媒体套餐轻松实现销售目标。 1. 策划细致的新闻稿 新闻稿是介绍旅游产品和服务的重要工具。确保新闻稿中包含吸引…

那些你面试必须知道的ES6知识点

目录 1、var、let、const的区别2、作用域考题3、合并两个对象4、箭头函数和普通函数的区别5、Promise有几种状态6、find和filter的区别7、some和every的区别 1、var、let、const的区别 区别一&#xff1a; var有变量提升&#xff0c;而let和const没有 <script>console.l…

通过核密度分析工具建模,基于arcgis js api 4.27 加载gp服务

一、通过arcmap10.2建模&#xff0c;其中包含三个参数 注意input属性&#xff0c;选择数据类型为要素类&#xff1a; 二、建模之后&#xff0c;加载数据&#xff0c;执行模型&#xff0c;无错误的话&#xff0c;找到执行结果&#xff0c;进行发布gp服务 注意&#xff0c;发布g…

美创科技入选“内蒙古自治区第一届网络安全应急技术支撑单位”

近日&#xff0c;内蒙古自治区党委网信办、国家网络应急技术处理协调中心内蒙古分中心评选“内蒙古自治区网络安全应急技术支撑单位”结果公布。 经自治区各地区、各部门和单位推荐各单位自主申报&#xff0c;资料审查和专家评审等环节&#xff0c;美创科技成功入选“内蒙古自治…