函数memcpy的实现及详解

       前言

        今天我们来了解一下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.mzph.cn/diannao/11626.shtml

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

相关文章

C++语言的字符数组

存放字符数据的数组是字符数组&#xff0c;字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性。 1. 声明一个字符数组 char c[5]; 2. 字符数组赋值方式 &#xff08;1&#xff09;为数组元素逐一赋值 c[0]H c[1]E c[2]L c[3]L c[4]O &#xff08;2&…

微信小程序开发,构建NPM报错解决

报错信息如下&#xff1a; message&#xff1a; NPM packages not found. Please confirm npm packages which need to build are belong to miniprogramRoot directory. Or you may edit project.config.jsons packNpmManually and packNpmRelationList appid: wx7144a5d5411…

SpringBoot 启动时查询数据库数据,并赋值给全局变量

创建一个组件 AreaData import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component;import java.u…

三极管 导通条件

一、三极管理解 三极管是电子行业常用的元器件之一&#xff0c;他是一种电流型控制的器件&#xff0c;他有三种工作状态&#xff1a;截止区&#xff0c;放大区、饱和区。当三极管当做开关使用时&#xff0c;他工作在饱和区。下面简短讲解三极管作为开关使用的方法&#xff0c;只…

2.三极管

2.习题 3.知识补充

Web 安全 PHP 代码审查之常规漏洞

前言 工欲善其事&#xff0c;必先利其器。我们做代码审计之前选好工具也是十分必要的。下面我给大家介绍两款代码审计中比较好用的工具。 一、审计工具介绍 PHP 代码审计系统— RIPS 功能介绍 RIPS 是一款基于 PHP 开发的针对 PHP 代码安全审计的软件。 另外&#xff0c;…

Spring Cloud 概述及项目创建

本篇主要介绍什么是Spring Cloud&#xff0c;以及Spring Cloud工程的创建 目录 一、什么是微服务&#xff1f; 集群 分布式 微服务 二、Spring Cloud 什么是Spring Cloud Spring Cloud 版本 Spring Cloud实现方案 Spring Cloud 工程创建 创建父工程 创建子工程 一、…

MySQL 大量数据插入优化

效率最好的方式是&#xff1a;批量插入 开启事务。 1、数据批量插入相比数据逐条插入的运行效率得到极大提升&#xff1b; ## 批量插入 INSERT INTO table (field1, field12,...) VALUES (valuea1, valuea2,...), (valueb1, valueb2,...),...;当数据逐条插入时&#xff0c;每…

C++类细节,反汇编,面试题02

文章目录 2. 虚函数vs纯虚函数3. 重写vs重载vs隐藏3.1. 为什么C可以重载&#xff1f; 4. struct vs union4.1. 为什么要内存对齐&#xff1f; 5. static作用6. 空类vs空结构体6.1. 八个默认函数&#xff1a;6.2. 为什么空类占用1字节 7. const作用7.1 指针常量vs常量指针vs常量…

【SRC-CPP-OpenCV】给图片更换背景色

文章目录 Part.I IntroductionPart.II Main_bodyChap.I 源码简析Chap.II 效果展示 Part.III 源码Reference Part.I Introduction 本文将介绍如何用 OpenCV 更换图片的背景色&#xff08;附有完整代码&#xff09;。 Part.II Main_body Chap.I 源码简析 配置部分&#xff1a…

Java文字识别接口、票据ocr、接口开发文档

曾经看到过这样一句话“如果把产品比作孩子的话&#xff0c;那么产品经理就是生孩子的”。由此可见&#xff0c;产品经理对于产品的重要性。一位有经验的产品经理提出的产品需求往往逻辑清晰&#xff0c;技术开发过程中修改需求的次数少&#xff0c;产品上线、推出后让人易于接…

uniapp:项目目录下没有package.json文件的创建办法

问题 在HbuilderX开发工具创建的uniapp项目&#xff0c;默认没有package.json文件。 此时如果在控制台使用npm 命令添加外部依赖包时&#xff0c;就会出现“no such file or directory *** package.json ”的提示错误。 解决方案 在控制台使用npm 命令&#xff0c;进行初始…

1-3ARM_GD32点亮LED灯

简介&#xff1a; 最多可支持 112 个通用 I/O 引脚(GPIO)&#xff0c;分别为 PA0 ~ PA15&#xff0c;PB0 ~ PB15&#xff0c;PC0 ~ PC15&#xff0c;PD0 ~ PD15&#xff0c;PE0 ~ PE15&#xff0c;PF0 ~ PF15 和 PG0 ~ PG15&#xff0c;各片上设备用其来实现逻辑输入/输出功能。…

【论文精读】| KBS2023-TMBL-多模态情感分析系列文章解读

TMBL: Transformer-based multimodal binding learning model for multimodal sentiment analysis 一. KBS2023-TMBL-用于多模态情感分析的极向量和强度向量混合器模型1 Abstract1.1 Motivation1.2 Method1.3 Results 2. Related Work2.1 情感分析2.1 基于transformer的2.1 模态…

字符数组(字符串):单词计数

字符数组 定义 初始化 : 单个字符初始化 用字符串常量初始化 输入输出 &#xff1a; %s 不能够获得带有分隔符的串 存储特点 结束标记&#xff08;\0) #include<stdio.h> #include<stdlib.h>#define N 32int main(){char str[N] {a,b,c};chr str0[N],str1[N],str…

LeetCode/NowCoder-链表经典算法OJ练习2

最好的&#xff0c;不一定是最合适的&#xff1b;最合适的&#xff0c;才是真正最好的。&#x1f493;&#x1f493;&#x1f493; 目录 说在前面 题目一&#xff1a;分割链表 题目二&#xff1a;环形链表的约瑟夫问题 SUMUP结尾 说在前面 dear朋友们大家好&#xff01;&…

(done) 什么是马尔可夫链?Markov Chain

参考视频&#xff1a;https://www.bilibili.com/video/BV1ko4y1P7Zv/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 如下图所示&#xff0c;马尔可夫链条实际上就是 “状态机”&#xff0c;只不过状态机里不同状态之间的边上是 “…

车载电子电器架构 —— Vector对于车载以太网的解决方案(协议栈)

车载电子电器架构 —— Vector对于车载以太网的解决方案(协议栈) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你…

实战WinRAR捆绑图片和恶意程序并自动上线Cobalt Strike(cs钓鱼日记)

钓鱼 - WinRAR捆绑图片和恶意程序并自动上线Cobalt Strike 环境准备 工具&#xff1a;Cobalt Strike、Winrar压缩工具、一张JPG图片 虚拟机IP&#xff1a; 【攻击机】Kali&#xff1a;192.168.232.128 【靶机】win7&#xff1a;192.168.232.144 情景&#xff1a;在钓鱼事…

老黄终于不穿皮衣了,分享一个AI换装AI试衣软件!

用AI实现在线试衣&#xff0c;或者在线换装&#xff0c;这不是一个新概念&#xff0c;肯定有人这么想过&#xff0c;但并不是所有人能都能轻松做到啊&#xff01; 今天就来分享一个人人都可以实现的方法&#xff0c;而且是那种傻瓜式的不用付钱的那种&#xff0c;甚至可以把软件…