C语言函数:内存函数memcpy()以及实现

2023/9/30 17:39:48

C语言函数:内存函数memcpy()

引言:

#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>

int main()
{
	int arr1[20] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[20] = { 0 };
	strcpy(arr2, arr1);
	return 0;
}

        

         strcpy函数:C语言函数:字符串函数及模拟实现strlen() 、strcpy()、 strcat()_srhqwe的博客-CSDN博客

        以上代码,如果用strcpy()函数,想将arr1拷贝到arr2中,要明白strcpy()是字符串拷贝函数,这样使用strcpy()会出现问题:

        类型不一样arr1和arr2是int类型,strcpy只接收char*类型。如果强行将arr1内容拷贝到arr2中,当是小端存储时,strcpy()访问完一个字节01后,当要访问第二个字节00时,发现00是ASCII码值为0,strcpy会认为这是\0,然后停止向后继续拷贝。最后arr2只拷贝了01过去,arr2的则变成了0.

        因为strcpy不能将arr1拷贝到arr2,因此就急需一个函数是针对内存块进行拷贝的。只要你是针对内存块拷贝,无论你是何种类型,何种数据都可以进行拷贝:

memcpy()函数:

        头文件:#include <string.h>

参数:

         函数类型是void*指针,说明返回的是任何类型指针的destination。

        destination和source与strcpy()一样,只是类型变成了void*

        size_t num是最关键的,意思是:从destination中拷贝num个字节到source中,

        

函数使用:

#define _CRT_SECURE_NO_WARNINGS

#include <string.h>

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1,20);
	return 0;
}

         此时要将arr1中的1,2,3,4,5拷贝到arr2中,一个int是4字节,5个int就是20字节,因此num传入20,结果:

        

         其中20可以使用sizeof(int),算出一个int大小,再x上5,也可以得到20

#define _CRT_SECURE_NO_WARNINGS

#include <string.h>

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	memcpy(arr2, arr1,5*sizeof(int));
	return 0;
}

memcpy函数的实现:

        创建:void* my_memcpy(void* dest, const void* sour, size_t num)

        size_t == (unsigned)int----------只有正数

        

#define _CRT_SECURE_NO_WARNINGS

#include <string.h>

void* my_memcpy(void* dest, const void* sour, size_t num)
{
	for (int i = 0; i < num; i++)
	{
		*((char*)dest + i) = *((char*)sour+i);
	}
	return dest;
}

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[10] = { 0 };
	my_memcpy(arr2, arr1,5*sizeof(int));
	return 0;
}

        因为dest是void*,不能通过+1或++之类的操作符对他进行改变。因为计算机并不知道void*+1跳多少字节。如果+1首先代码行就会变成红色(出错)

        这里将dest和sour强制类型转换成char*,那么每次+i就能移动一个字节。可以保证每个字节都做出了改变。

        如果强制类型转换成int或其他的类型,这个函数就有了局限性。+1就跳4字节。那么中间这四个字节没有做出改变,如果此时传入char类型的数据,那么就会使得内容缺失。

        


http://www.jnnr.cn/a/369210.html

相关文章

Mac升级go版本(指定或最新)

升级流程 在Mac中对go版本的升级采用先卸载后安装的过程进行go版本升级&#xff08;或者回退&#xff09;。 卸载 在卸载前&#xff0c;先查看下当前的go版本&#xff1a; go version 删除 go 目录&#xff1a; sudo rm -rf /usr/local/go /usr/local/go/bin/go /etc/path…

CSS面试题

CSS面试题css画三角形&#xff1a;本质就是利用边框bordercss选择器优先级一个div&#xff0c;没有给高度和宽度&#xff0c;怎么水平垂直居中height与line-height的区别css画三角形&#xff1a;本质就是利用边框border 我们首先看一种情况&#xff1a; width:0px; height:0px…

数据库:Redis哨兵及cluster集群部署

一、redis数据库哨兵模式 目录 一、redis数据库哨兵模式 1、什么是哨兵模式 2、哨兵的作用 3、哨兵结构组成 4、哨兵故障转移机制 5、哨兵工作、切换原理 6、哨兵主节点选举原则 7、哨兵模式部署 二、redis数据库cluster集群 1、cluster集群优点、数据存储及同步方式…

【操作系统复习】第3章 处理机调度与死锁 3

死锁&#xff08;Deadlock&#xff09;&#xff1a;指多个进程在运行过程中因争夺资源而造成的一种僵局&#xff0c;当进程处于这种僵持状态时&#xff0c;若无外力作用&#xff0c;这些进程都将永远不能再向前推进。 对资源不加限制地分配可能导致进程间由于竞争资源而相互制约…

【Docker】1、Docker 基础知识随意介绍

文章目录一、什么是 Docker二、为什么要用 Docker 部署三、Ubuntu Docker 安装四、Dockerfile五、镜像5.1 镜像拉取5.2 镜像删除5.3 使用 docker save 将镜像保存成 tar 归档文件5.4 导入使用 docker save 导出的镜像5.5 使用 docker import 从归档文件中创建镜像5.6 将本地镜像…

CNStack 网络插件:hybridnet 的设计与实现

作者&#xff1a; 若禾 CNStack 是阿里云推出的一款开放的一站式企业级云原生技术中台。在异构的混合云基础设施上&#xff0c;对资源进行统一纳管和优化调度&#xff0c;以开放的、云原生的方式为平台及业务系统提供生产可用的产品及组件&#xff0c;帮助用户打造满足大规模、…

【Python小技巧】Anaconda环境下使用Notepad++运行python程序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Anaconda、notepad是什么&#xff1f;二、配置过程1. 找到Python.exe2. 编辑运行命令3. 试运行一段代码4. 保存快捷方式总结前言 最近升级了电脑系统&#…

Qt音视频开发27-ffmpeg视频旋转显示

一、前言 用手机或者平板拍摄的视频文件,很可能是旋转的,比如分辨率是1280x720,确是垂直的,相当于分辨率变成了720x1280,如果不做旋转处理的话,那脑袋必须歪着看才行,这样看起来太难受,所以一定要想办法解析到视频的旋转角度,然后根据这个角度重新绘制。在窗体那边也…

《花雕学AI》05:令人惊奇的ChatGPT,一个能够与人类对话的人工智能

今天是周末&#xff0c;4月2日&#xff0c;早上五点就起床了&#xff0c;没有去打羽毛球。 我平时在手机上喜欢看今日头条&#xff0c;了解各种时事新闻&#xff0c;发现今年来频繁出现的单词就是&#xff1a;ChatGPT&#xff0c;通过简单搜索&#xff0c;我逐步接受了这个概念…

从零开始学OpenCV——图像灰度变换详解(线性与非线性变换)

文章目录图像灰度变化灰度变换介绍灰度线性变换灰度分段线性变换图像点运算灰度非线性变换线性点运算灰度的非线性变换&#xff1a;对数变换灰度的非线性变换&#xff1a;伽马变换灰度的非线性变换&#xff1a;对比拉伸灰度的非线性变换&#xff1a; S形灰度变换灰度的非线性变…

Spring Cloud Alibaba Sentinel

一、简介 官网&#xff1a; https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D Sentinel: 分布式系统的流量防卫兵 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统…

HDFS Balancer负载均衡器

文章目录1、背景2、什么是平衡2.1 每个DataNode的利用率计算2.2 集群的利用率2.3 平衡3、hdfs balancer语法4、运行一个简单的balance案例4.1 设置平衡数据传输带宽4.2 执行banalce5、参考文档1、背景 当我们的hadoop集群运行了一段时间之后&#xff0c;各个DataNode上的数据分…

[LeetCode刷题] - LC006 ZigZag Conversion

题目描述 给定一个字符串&#xff0c;想让你用纵向zig-zag形式展开&#xff0c;然后在横向进行拼接输出最后的新字符串 LeetCode 006Can you solve this real interview question? - Level up your coding skills and quickly land a job. This is the best place to expand…

基于Java(SSM)的学生考勤管理系统

前端&#xff1a;jsp 框架&#xff1a;SSM 数据库&#xff1a;MySQL 有数据库文件&#xff0c;导入即可用 可作为毕设参考 资源路径&#xff1a; https://download.csdn.net/download/yw1990128/87630215 1.1功能需求 信息技术的广泛使用&#xff0c;传统的考勤管理已经不…

多传感器融合定位GNSS、IMU、Lidar、Camera

概述 1.纯激光雷达点云定位 2.融合GNSS的点云定位 3.融合IMU的点云定位 4.融合GNSS、IMU的点云定位 5.融合Camera的点云定位 参考AutoWare 或者 Apollo AutoWare&#xff1a; https://github.com/autowarefoundation/autoware_ai_perception Apollo&#xff1a; https://git…

关于uview2.0计步器最大值赋值问题

需求&#xff1a;当有设置最大值时&#xff0c;计步器则设置max为此数值&#xff0c;最小值1&#xff0c;加大最大值时即不能在往上增加&#xff0c;最大值设置为0则为不限&#xff1b;那么u-number-box的max就要根据设置的数值去判断 uview的u-number-box文档&#xff1a;htt…

oracle 低版本 11.2.0.1.0 创建DBlink访问 oracle 19c提示用户密码错误ORA-010107

由于导数据需要&#xff0c;在oracle 11.2.0.1创建dblink访问oracle19c数据库&#xff0c;提示用户密码错误。 当然不会存在创建是 用户密码错误的情况。 报错页面如下 后面猜想是由数据库版本太低问题导致&#xff0c; 11g版本信息如下&#xff1a; SELECT t.* FROM v$vers…

小白学Pytorch系列--Torch.nn API Quantized Functions(19)

小白学Pytorch系列–Torch.nn API Quantized Functions(19) 方法注释parametrizations.orthogonalparametrizations.spectral_normparametrize.register_parametrizationparametrize.remove_parametrizationsparametrize.cachedparametrize.is_parametrizedparametrize.Paramet…

MySQL主从复制的原理与实操+mycat2读写分离

文章目录MySQL主从复制的原理与实操主从复制原理MySQL主从复制的高级应用MySQL主从复制实操&#xff08;一主两从&#xff09;**环境准备****master配置**slave设置MySQL读写分离配置&#xff08;一主两从&#xff09;创建数据源查询集群创建逻辑库修改逻辑库的数据源测试读写分…

spark sql(七)源码解析 - sparksql什么时候将时间类型转换成整型或者长整型,又是什么时候将整型或长整型转为时间类型?

1、背景 在做sql下推逻辑时&#xff0c;因为时间类型的自动转换导致自定义的下推逻辑失效 &#xff0c;为了深入了解问题的原因和更好的解决问题&#xff0c;所以准备源码追踪下sparksql转换类型的具体时间点。另外因为只需要验证sql 字段转换的逻辑&#xff0c;所以只需要有一…
最新文章