【C语言】内存函数(memcpy)的使用和模拟实现

目录

  • 一、`memcpy`定义
    • 1.`memcpy`在**cplusplus**中的定义
    • 2.`memcpy`**复制内存块**
    • 3.参数
      • a.目的地
      • b.源
      • c.数字
    • 4.函数返回值
    • 5.函数头文件
  • 二、`memcpy`的使用
    • 使用`memcpy()`函数完成拷贝整型数组数据
  • 三、memcpy的模拟实现
    • 思路
    • 代码

一、memcpy定义

1.memcpycplusplus中的定义

链接: link
在这里插入图片描述

2.memcpy复制内存块

void * memcpy ( void * destination, const void * source, size_t num );
  • num 字节的值从源指向的位置直接复制到目标指向的内存块。

  • 源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。

  • 该函数不检查源代码中是否有任何终止null 字符 - 它始终精确地复制 num 字节。

  • 为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 字节,并且不应重叠(对于重叠的内存块,memmove 是一种更安全的方法)。

3.参数

a.目的地

指向要复制内容的目标数组的指针,类型转换为 void* 类型的指针。

b.源

指向要复制的数据源的指针,类型转换为类型为 const void* 的指针。

c.数字

要复制的字节数。size_t是无符号整数类型。

4.函数返回值

函数的返回值类型是无类型指针(void*),它的作用是在函数运行结束后返回拷贝后的目的地内存块的起始地址.

5.函数头文件

该函数包含在头文件<string.h>中.

二、memcpy的使用

使用memcpy()函数完成拷贝整型数组数据

如下,我们使用memcpy()函数将arr1数组的前20字节(即前5个整形)拷贝进arr2中:

分别给memcpy()函数传入3个参数:

目的地址arr2,数据源地址arr1,拷贝字节数

#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}

查看结果:
在这里插入图片描述
成功的将arr1中的前5个整形的数据拷贝进了arr2的前5个整形空间中.

三、memcpy的模拟实现

思路

  • 1.首先传进函数中的目的地址和源地址指针都不能为NULL如果为NULL的话指针会发生越界访问问题所以在函数开始时用assert断言dstsrc
  • 2.因为我们要按照字节拷贝传进来的数组可能为任意的类型,所以把数据强转为(char*)类型(因为char类型在内存中占用1个字节)
  • 3.因为返回值是目的地址的起始位置的地址,所以我们移动dst指针前要提前记录目的地址的起始位置地址

代码

void * my_memcpy ( void * dst, const void * src, size_t count)
{void * ret = dst;assert(dst);assert(src);/** 从低地址向高地址拷贝*/while (count--) {*(char *)dst = *(char *)src;dst = (char *)dst + 1;src = (char *)src + 1;}return(ret);
}

查看结果

在这里插入图片描述
成功的将arr1中的前20个字节拷贝到了arr2中.

※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

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

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

相关文章

太赞了!微信好友恢复用这6招就能找回来(2024最新)

想象一下这样的情景&#xff1a;您突然意识到自己不小心把某个重要的微信好友删除了&#xff0c;或者您的微信好友列表突然出现了空白&#xff0c;这可能会让人感到困扰。 因为微信是我们日常生活中最常用的即时通讯工具之一&#xff0c;我们与家人、朋友和同事之间的沟通几乎…

初识C++之命名空间(namespace)

初识C之入门 命名空间(namespace) 文章目录 初识C之入门 命名空间(namespace)1.为什么要有命名空间2. 命名空间 namespace使用方法3. 作用域限定符(::&#xff09;和 命名空间(namespace)4. 命名空间的定义5. 命名空间的嵌套6. 命名空间的使用7. 总结 1.为什么要有命名空间 在C…

Git命令上传本地项目至github

记录如何创建个人仓库并上传已有代码至github in MacOS环境 0. 首先下载git 方法很多 这里就不介绍了 1. Github Create a new repository 先在github上创建一个空仓库&#xff0c;用于一会儿链接项目文件&#xff0c;按照自己的需求设置name和是否private 2.push an exis…

N5230A安捷伦N5230A网络分析仪

181/2461/8938产品概述&#xff1a; Agilent N5230A 网络分析仪提供了速度和精度的卓越组合&#xff0c;用于测量多端口和平衡组件&#xff0c;例如高达 50 GHz 的滤波器、双工器和射频模块&#xff08;取决于选件&#xff09;。Agilent N5230A 分析仪的自动端口扩展功能可自动…

zabbix自定义监控进程、日志文件

zabbix自定义监控进程、日志文件 zabbix自定义监控进程 在客户端安装httpd服务 [rootnode1 ~]# yum -y install httpd [rootnode1 ~]# systemctl start httpd [rootnode1 ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Pr…

filebox在线文件管理工具V1.11.1.1查分吧修改自用版免费分享[PHP]

* 基于:https://down.chinaz.com/soft/35899.htm * 查分吧 修改自用版今日对外分享(自2016年1.10版本以来一直用他云开发:Web环境即时看效果) * 也可以用于本人很多txt/csv通用查询系统的在线管理后台管理数据 * 默认登陆账号filebox密码nidemima * 修改账号密码:21-22行;获取…

通过WSL在阿里云上部署Vue项目

参考&#xff1a; 阿里云上搭建网站-CSDN博客 云服务器重装 关闭当前运行实例 更换操作系统&#xff0c;还有其他的进入方式。 选择ubuntu系统&#xff08;和WSL使用相同的系统&#xff09;。 设置用户和密码。发送短信验证码。 新系统更新。秒速干净的新系统设置完成。 这…

es6 Class基本语法和继承

es6 Class基本语法 class的基本语法&#xff1a; ES6 的class只是一个语法糖&#xff0c;它的绝大部分功能&#xff0c;ES5 都可以做到&#xff0c;新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已 传统用构造函数生成实例 function Point(x, y) {th…

基于单片机锂电池电量检测数码管显示系统设计

**单片机设计介绍&#xff0c;基于单片机锂电池电量检测数码管显示系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机锂电池电量检测数码管显示系统设计的主要目标是实时、准确地检测锂电池的电量&#xff0c;并…

Java中变量a = 3中的3是存储在栈还是堆?

1、栈区&#xff08;stack&#xff09; 由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量的值等。 2、堆区&#xff08;heap&#xff09; 是一个可动态申请的内存空间&#xff08;其记录空闲内存空间的链表由操作系统维护&#xff09;&#xff0c;在j…

状态模式实战运用

目录 前言 UML plantuml 类图 实战代码 Form State Client 前言 通常一个完整的业务流程中&#xff0c;会经历多个阶段&#xff0c;每个阶段即一个业务状态&#xff0c;不同状态下对应这不同的业务处理逻辑。 无脑堆砌 if else 做判断然后选择对应的业务处理其实也能…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接&#xff1a; 连接显示屏模块&#xff0c;显示屏的SCL在B10&#xff0c;SDA在B11。 程序目的&#xff1a; 发送LED_ON指令打开板载LED灯&#xff0c;发送LED_OFF关闭板载LED灯&#xff0c;与上一个博客不同&#xff0c;这个实际上是实现串口收发文本数据包。 …

enscan自动化主域名信息收集

enscan下载 Releases wgpsec/ENScan_GO (github.com) 能查的分类 实操&#xff1a; 首先打开linux 的虚拟机、 然后把下面这个粘贴到虚拟机中 解压后打开命令行 初始化 ./enscan-0.0.16-linux-amd64 -v 命令参数如下 oppo信息收集 运行下面代码时 先去配置文件把coo…

如何购买阿里云服务器?2024年阿里云服务器购买流程分享

很多新手用户不知道阿里云服务器购买的流程&#xff0c;不清楚该如何选购云服务器配置才能既满足需求又不会掉“坑”里&#xff0c;为此笔者整理了2024年购买阿里云服务器的完整流程&#xff0c;分为通过云服务器ECS产品页下单购买和通过阿里云活动购买云服务器两种最常见的购买…

速锐得解码广汽智能数字技术车型埃安Y纯电动CAN数据DBC控制策略

随着电动化、智能化、信息化、数字化、网联化、共享化技术的不断应用与汽车行业出行趋势加深&#xff0c;为进一步巩固关键技术优势以及稳供控本、提升盈利能力&#xff0c;整车厂加速推进新能源产业链垂直整合。广汽埃安就是最为杰出的代表&#xff0c;他们不仅布局了芯片&…

大话设计模式之迪米特法则

迪米特法则&#xff0c;也称为最少知识原则&#xff08;Law of Demeter&#xff09;&#xff0c;是面向对象设计中的一个重要原则&#xff0c;其核心思想是降低耦合度、减少对象之间的依赖关系&#xff0c;从而使系统更加灵活、易于维护和扩展。 根据迪米特法则&#xff0c;一…

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…

Web Components使用(一)

在使用Web Components之前&#xff0c;我们先看看上一篇文章Web Components简介&#xff0c;其中提到了相关的接口、属性和方法。 正是这些接口、属性和方法才实现了Web Components的主要技术&#xff1a;Custom elements&#xff08;自定义元素&#xff09;、Shadow DOM&#…

C#手术麻醉信息系统全套商业源码,自主版权,支持二次开发 医院手麻系统源码

手术麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术后的信息管理提供支持。 手术麻醉信息系统可与EM…

MySQL 数据库的日志管理、备份与恢复

一. 数据库备份 1.数据备份的重要性 备份的主要目的是灾难恢复。 在生产环境中&#xff0c;数据的安全性至关重要。 任何数据的丢失都可能产生严重的后果。 造成数据丢失的原因&#xff1a; 程序错误人为,操作错误,运算错误,磁盘故障灾难&#xff08;如火灾、地震&#xff0…