函数memcpy的实现及详解

news2024/12/23 16:41:44

       前言

        今天我们来了解一下memcpy函数和它的作用吧,咋们之前已经熟悉了strcpy的使用,它的作用是字符串的拷贝,那么当我们要拷贝其他类型的数据时,应该使用什么函数呢,我们今天给大家介绍的就是memcpy函数,他可以实现字符串以外其他数据的拷贝,没有strcpy函数只能拷贝字符串的局限性。

        了解memcpy函数

        memcpy:他是C和C++标准库中的一个函数,用于内存操作。它的作用是在内存中复制一块数据从一个位置到另一个位置。

        memcpy的函数原理

        

        我们可以看到memcpy函数的官方解释中说,在缓冲区之间复制字符,这就是memcpy与strcpy的区别之处,strcpy只能复制字符串。

        memcpy的返回值是指向目标内存区域dest的指针,这里为空指针,因为他也不知道自己会返回什么类型的数据,可能是int类型,可能是char类型都不一定,因为我们不知道内存中存放的是什么类型的数据。

        指针dest:指向目标内存位置的指针,即数据将要被复制到的位置。指针src:指向源内存位置的指针,即数据将要被复制出来的位置。一共复制count个字节。

        简单来说就是memcpy函数会从src指向的地址开始,复制count个字节到dest所指向的地址。

        函数使用时的注意事项

        在我们使用memcpy函数的时候有这么几点需要注意

        1.这个函数在遇到‘\0’的时候不会停下来

        2.确保目标地址和源地址指向的内存区域是有效且已经分配的

        3.如果src和dest有任何重叠,复制的结果都是未定义的。

        我们了解了memcpy来试着写一个自己的memcpy函数吧

        代码展示

        

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i;
	for (i = 0;i < 10;i++)
		printf("%d ", arr2[i]);
	return 0;
}

        代码解析

        我们创建两个数组arr1和arr2,我们将数组arr1中的数据复制到arr2中,之前咋们了解了数组名是数组首元素的地址,我们将数组名直接传参就可以,我们复制20个字节到数组arr2中。一个整型数据为4个字节,这里就是复制5个数字到arr2数组中。

        我们来实现memcpy函数,首先使用断言assert函数确保指针dest与指针src不为空指针,我们使用while循环来进行数据的复制,首先我们要拷贝的内容单位为字节。

        我们使用整型来拷贝,不行,我们整型指针拷贝可能实用与当前举例,但是在面对其他的数据类型是不行的,这里我们要使用char*,每次复制一个字节,这样就不会出问题。

        我们将src解引用拿到指针所指向内存的数据(*src),之后我们强制类型转化为char*。

                ​​​​​​​        ​​​​​​​        

        之后要注意了,大家是不是在指针偏移的时候喜欢写成(char*)dest++,这里是会出问题的,因为这样写的时候这种强制类型转换是临时的,他没有彻底改变dest的类型,这样写的时候dest的类型还是void*,我们将他写成 dest=(char*)dest+1的方式就没问题。

        这段程序我们需要执行num次才可以完成数据的拷贝,这里我们就使用while循环,条件为num--。

        我们创建一个指针ret来接收dest的地址,最后将ret返回就可。

        运行结果

        

        当然它也是有缺陷的,就如同我们之前提到的,如果src和dest有重叠,那么我们拷贝的结果会出问题,需要使用到另一个函数memmove。这个函数咋们今天就不接着说喽,如果感兴趣可以点击链接查看哦。

        memmove函数

        继续加油!!

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

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

相关文章

1960—2021年中国月日均温降水时间序列

基于均质级数&#xff08;MASH&#xff09;和气候多元分析方法&#xff0c;首先对1960—2021年中国366个站点的日均气温、最高气温、最低气温和降水量进行不均匀性检测、估计和调整&#xff0c;建立均质化日气温和降水数据集。所有数据集均由希腊&#xff08;帕特雷大学物理系大…

Quests system for Unity

一个简单而灵活的任务系统将帮助你实现所有的想法,而不需要事件和逻辑中的一堆额外代码! 我的资产是一个用于执行任务的独立系统。 特征: 任务逻辑不需要继承MonoBehaviour。 在一行中完成所需任务的激活/进度/完成。 易于理解的界面,包含项目中所有任务的列表。 不需要连接…

【kubeflow文档】kubeflow介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…

Android PreferenceActivity可以自动设置的Activity

1、介绍 PreferenceActivity 是一个抽象类&#xff0c;继承自ListActivity ,该类封装了SharedPreferences. PreferenceActivity 提供了一些常用的设置项如,与普通组件一样&#xff0c;这些配置项既可以从XML文件创建&#xff0c;也可以从代码创建. 每一个设置项标签有一个andro…

在博弈中寻找机会:利用已知信息撬动更多有利信息

在人生的道路上&#xff0c;我们都在参与一场巨大的博弈&#xff0c;无论是职场竞争、商业战争还是人际关系&#xff0c;都需要我们利用已知信息去撬动更多有利的信息&#xff0c;以便在变数中寻找机会。这场博弈既充满挑战&#xff0c;又蕴含着无限可能。 博弈的本质是竞争和合…

IP跳变是什么,有什么作用?

IP跳变&#xff0c;简单来说&#xff0c;就是用户在使用网络时&#xff0c;不固定使用一个IP地址&#xff0c;而是定期或根据需求切换到另一个IP地址。这种技术为用户在网络环境中提供了一定的灵活性和安全性。 首先&#xff0c;我们来看看IP跳变的具体实现方式。当用户需要切…

齐护K210系列教程(十五)_联网控制

联网控制 1&#xff0c;软硬件的准备2&#xff0c;应用的理解3&#xff0c;远程点亮AIstart_Q1的灯4&#xff0c;远程控制AIstart_Q1拍照5&#xff0c;更多网络应用5&#xff0c;课程资源联系我们 1&#xff0c;软硬件的准备 在很多场合应用AIstart时&#xff0c;会要用到网络…

2024年一些值得关注的边缘计算招投标!中国移动、中国联通、中国铁塔大单来了!...

1.大单来了&#xff01;中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告&#xff0c;3079万&#xff01; 项目名称&#xff1a;中国移动湖北公司算力设备采购(移动边缘云四期扩容)招标公告 本招标项目为(中国移动湖北公司算力设备采购(移动边缘云四期扩容)&#xff…

PCDN边缘计算小白入门指南

一、PCDN边缘计算简介 PCDN是一种基于P2P技术的边缘计算内容分发网络。它通过挖掘和利用边缘网络中的海量碎片化闲置资源&#xff0c;构建出低成本、高品质的内容分发网络服务。通过集成PCDN SDK&#xff08;软件开发工具包&#xff09;&#xff0c;可以获得与CDN&#xff08;…

记录:robot_localization传感器数据融合学习

一、参考资料 官方&#xff1a; http://wiki.ros.org/robot_localizationhttp://docs.ros.org/en/noetic/api/robot_localization/html/index.html2015 ROSCon 演讲官方网址&#xff08;youyube上也有这个视频&#xff09; 实践教程 https://kapernikov.com/the-ros-robot_…

【C++】再识构造函数:初始化列表新方式

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a; 再识构造函数&#xff1a;初始化列表新方式 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3c6;感…

【实践】使用vscode来debug go程序的尝鲜

配置 首先&#xff0c;当然得配置好vscode 的go环境&#xff0c; 装个go插件就基本满足了 配置 launch.json, 可以配置多个环境的程序启动参数&#xff08;很友好&#xff09; {"version": "0.2.0","configurations": [{"name": &…

C++深度解析教程笔记8

C深度解析教程笔记8 第17课 - 对象的构造&#xff08;上&#xff09;类定义中成员变量i和j的初始值&#xff1f;实验-成员变量的初始值对象初始化解决方案1实验-手动调用函数初始化对象对象初始化解决方案2&#xff1a;构造函数实验-构造函数小结 第18课 - 对象的构造&#xff…

乡村振兴的乡村人才振兴计划:培养乡村人才,吸引人才回流,激发乡村发展活力,为美丽乡村建设提供人才保障

目录 一、引言 二、乡村人才振兴计划的必要性 &#xff08;一&#xff09;乡村发展面临的人才困境 &#xff08;二&#xff09;人才振兴对乡村振兴的推动作用 三、乡村人才振兴计划的实施路径 &#xff08;一&#xff09;加强乡村教育体系建设 &#xff08;二&#xff0…

AD软件针对分散的元器件归一排列

先框选 然后快捷键TOL 绿色的十字箭头选框选位置 完成

Golang | Leetcode Golang题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; func isScramble(s1, s2 string) bool {n : len(s1)dp : make([][][]int8, n)for i : range dp {dp[i] make([][]int8, n)for j : range dp[i] {dp[i][j] make([]int8, n1)for k : range dp[i][j] {dp[i][j][k] -1}}}// 第一个字符串从 …

deveco studio 打开官方案例,不显示运行按钮。

就拿官方的search举例好了 git 地址 https://gitee.com/harmonyos/samples/tree/master/ETSUI/Search 使用deveco studio打开Search项目&#xff0c;打开Tools->Device-Manager中的Local Emulator本地模拟器&#xff0c; 此时会发现&#xff0c;运行按钮是灰色的&#xff0…

【前端性能优化】深入解析重绘和回流,构建高性能Web界面

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f3af; 引言&#xff1a;探索Web性能的基石&#x1f3d7;️ 基础概念&#xff1a;什么是重绘和回流&#xff1f;&#x1f4cc; 回流&#xff08;Reflow&#xff09;&#x1f4cc; 重绘&#xff08;Repaint&#xff0…

阿赵UE引擎C++编程学习笔记——解决中文乱码问题

大家好&#xff0c;我是阿赵。   在UE编写C的时候&#xff0c;可能有些朋友发现&#xff0c;在C里面如果打印输出或者赋值一些中文的字符串的时候&#xff0c;会出现各种的报错&#xff0c;要么乱码&#xff0c;要么直接编译不过。   这个问题&#xff0c;其实和UE本身没什…