C语言【进阶篇】- 部分内存函数的使用以及模拟实现

C语言中字符串和内存库函数的模拟实现 文章目录前言与字符串有关的库函数库函数strlenstrlen函数的使用strlen函数的模拟实现库函数strcpystrcpy函数的使用strcpy函数的模拟实现库函数strcmpstrcmp的使用strcmp函数的模拟实现库函数strcatstrcat函数的使用strcat函数的模拟实现库函数strstrstrstr函数的使用strstr函数的模拟实现与内存拷贝有关的函数库函数memcpymemcpy函数的使用memcpy函数的模拟实现库函数memmovememmove函数的使用memmove函数的模拟 阅读详情

1.memcpy的使用以及模拟实现

2.memmove的使用以及模拟实现

目录

1.memcpy的使用以及模拟实现

2.memmove的使用以及模拟实现


1.memcpy的使用以及模拟实现

 memcpy函数的简单理解:

memcpy函数是内存拷贝,可以拷贝字符串、整型数组、结构体数据,因此用void *dest,这种指针类型变量可以接收任意类型的地址,谁的地址都能放到这。 

第一个参数是指向目的地的,第二个参数是指向源头的,第三个参数你要拷贝多少个字节。

·函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
·这个函数在遇到 '\0' 的时候并不会停下来。
·如果source和destination有任何的重叠,复制的结果都是未定义的。

1.memcpy函数的使用:

(1)整型的拷贝

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
 
int main()
{
	int arr1[] = { 3, 4, 5, 6, 7, 6, 7, 8, 9, 10 };
	int arr2[20] = { 0 };
	//将arr1的内容拷贝到arr2中
	memcpy(arr2, arr1, 40);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

运行结果:

(2)浮点型的拷贝:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
 
int main()
{
	float arr1[] = { 1.0, 2.0, 3.0 ,4.0};
	float arr2[5] = { 0 };
	//将arr1的内容拷贝到arr2中
	memcpy(arr2, arr1, 8);
	//   float*  float*
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		printf("%f ", arr2[i]);
	}
	return 0;
}

2.memcpy函数的模拟实现:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
 
void* my_memcpy(void* dest, const void* src, size_t num)//num的单位是字节
{
	void* ret = dest;
	assert(dest && src);
	while (num--)
	{
		*(char*)dest = *(char*)src;//char*是最小的指针一次拷贝一个字节
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}
 
 
int main()
{
	int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr1, 20);
	int i = 0;
	for (i = 0; i < 20; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

由此可知memcpy函数是用来处理 不重叠的内存拷贝的。

那有没有什么函数可以重叠拷贝?下边将介绍memmove函数

2.memmove的使用以及模拟实现
1.memmove的使用

(1)简单理解:

仔细看的话能看出和memcpy参数一模一样,用法也一模一样

  • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  • 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

2)memmove的使用:

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

运行结果:

2.memmove的模拟实现

数组随着下标的增长地址由高到低变化 

重叠拷贝分三种情况:

① 从前往后,如果这时候从后往前拷贝7时会把6覆盖掉,拷贝6是把5给覆盖掉...

②从后往前,如果这时候从前往后3会覆盖掉4...和上面情况相似

③从前往后,从后往前都行,因为两个数组不起冲突

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

运行结果:

 总结:重叠的内存拷贝交给memmove来做,memmove 当然也可以拷贝不重叠的拷贝

【C语言】内存操作函数 本文详细讲述了内存函数的用法及它的模拟实现,里面还有相对应的具体用法,能够快速的掌握。 阅读详情

相关推荐

USB的24脚和12脚TYPEC引脚定义

USB 是一种接口,用于将设备连接到计算机上。通过该连接,计算机可以向设备发送数据或检索来自设备的数据。USB 为开发者提供了一个标准接口,适用于多种不同类型的应用。借助于系统的设计过程,USB 设备易于连接和使用。本应用笔记会使该过程变得更加简单。以下是本应用笔记中会使用的概念:USB 历史USB 架构USB 物理接口USB 速度USB 电源USB 端点USB 通信协议USB 描述符USB 类设备USB 枚举与配置过程。

易板 1万+

内存函数中的拷贝、比较和设置内存函数(memcpy,memmove,memcmp,memset)

文章目录一、memcpy - 内存拷贝11.函数介绍2.模拟实现二、memmove - 内存拷贝21.函数介绍(与memcpy函数的区别)2.模拟实现三、memcmp - 内存比较四、memset - 内存设置 一、memcpy - 内存拷贝1 1.函数介绍 void *memcpy( void *dest, const void *src, size_t count ); memcpy函数是一个用于拷贝两个不相关的内存块的函数。memcpy函数会从src的位置开始向后复制count个字节的数据到dest

2021dragon的博客 2890

VsCode安装和配置c/c++环境(超完整,小白专用)

1. vsCode配置C/C++环境 1. vsCode下载和安装 1. 下载Microsoft vsCode [vsCode在这里插入图片描述官网下载: https://code.visualstudio.com/ 2. 安装vsCode 3. 下载中文插件 我这边已经下载过,刚卸载但是没有重启编译器,所以界面显示了中文 2. MinGW编译器下载和配置 1. 下载MinGW 在线安装——下载MinGW-W64-install.exe(速度慢) 下载压缩包——×86_64-posix-

黄化的多多 60万+

内存拷贝的注意事项

有道面试题是让写出memcpy的实现,memcpy是c和c++使用的内存拷贝函数,功能是从源地址所指的内存地址的起始位置开始拷贝n个字节到目标地址所指的内存地址的起始位置中。与此类似的,在使用strcpy的时候,也应该需要注意这些问题。我们粗略的考虑下有哪些是值得注意的。   1 需要对参数进行检查,当传入源地址和目的地址参数有NULL时需要特殊处理;   2 源地址在函数中是不应该被修

刘佳玺的博客 4246

TCP协议中ARQ自动重传的三种实现方式对比(含SACK详解)

本文深入解析TCP协议中ARQ自动重传的三种实现方式,包括停止-等待、回退N步和选择重传协议,特别详细介绍了SACK机制的工作原理和优势。通过对比分析各协议的效率、复杂度和适用场景,为网络通信中的可靠性传输提供了实用的选型指南。

weixin_30776273的博客 461

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1381

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

它有三个参数,可以看到,它的前两个参数不再是char * 指针,而是void*的指针了,因为我们不再知道要拷贝的内容具体是什么数据类型,所以可以使用void * 的指针,而它的第三个参数是一个无符号整型,代表了要拷贝的内存的字节数。这时候就要使用我们的内存函数memcpy,mem是memory的缩写,它原本是记忆的意思,在这里是内存的意思,它的作用范围就宽泛多了,因为它是对内存块的内容进行拷贝,不管内存中存放的是什么数据类型,都可以通过拷贝内存块来实现拷贝。可以看到失败了,这是为什么呢?

hdxbufcbjuhg的博客 2802

开发板的使用

一、开发板使用学习大纲。 1、开发板组成、核心板资源,底板资源。 2、开发板连接、调试工具、串口参数配置。 3、开发板启动过程。 4、文件传输 1)使用串口传输。 上传/下载 2)使用网口传输。 上传/下载 5、临时/永久配置开发板IP地址。 6、开发板启动脚本。 二、开发板的组成。 核心板: CPU处理器: 芯片:S5P6818(三星) 内核: ARM cortex-A53 -> 八核处理器 运行内存:512MB*2=1G nandflash:4G 底板: 电源线:5V 串口...

qq_45633736的博客 2658

【C语言】——内存函数的使用及模拟实现

摘要?不知道写什么

yusjushd的博客 1328

采用超级电容设计的UPS不间断电源,用于掉电数据保存,可续航10-60秒

关键词:树莓派 CM4 UPS 不间断电源 掉电保存 超级电容 SuperCap 充电 升压 续航 10F 法拉电容 Mcuzone 野芯科技 概述:我们经常会遇到系统意外掉电的情况,对于一些可靠性要求很高的工业现场设备或者运行过程中有重要数据需要保存的平台就需要UPS电源了。常规的UPS采用后备锂电池设计,具备无缝切换、续航时间长、稳定可靠等特点,但同时也有价格过高、体积过大的缺点。对于不少仅需在检测到系统掉电后对数据进行保存即可的应用而言,这些标准的UPS电源就不太合适,为此我...

6603

实测避坑:用SGM61720做BUCK电路,SW引脚电压尖峰怎么压下去?

本文针对SGM61720在BUCK电路中SW引脚电压尖峰问题,提供实测避坑指南。通过分析电压尖峰、过冲等核心问题,详细讲解自举电阻调整、RC缓冲电路计算和PCB走线优化三大解决方案,帮助工程师有效降低SW引脚电压尖峰,提升系统稳定性和EMI性能。

weixin_42634811的博客 212

在21世纪的我用C语言探寻世界本质——内存函数的使用和模拟实现

“爱错”——王力宏

2401_88325505的博客 2094

【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系

摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。

智慧空间实验室 2400

C语言string.h函数详解及部分模拟实现

一键获取string.h函数解析

m0_73900674的博客 9592

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【C语言】内存函数详细讲解

前面我们学习了字符串函数,但字符串函数只能对字符串进行操作,但在C语言中有很多的数据类型,所以本章讲解一些内存函数,这些函数可以对任何数据类型进行拷贝、追加、比较。

mfy12138的博客 3361

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C语言——内存函数的使用与模拟实现

在C语言中除了字符函数和字符串函数外,还有关于内存的函数,现在我们就来学习一下内存函数吧!!!

m0_73523775的博客 2653

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C语言内存函数

上期我们学习了字符函数以及字符串函数,但是字符串函数仅仅只能对字符进行操作,那么这次我们来学习一下内存函数在C语言中内存函数是一组用于内存操作的标准库函数,它们定义在 <string.h>头文件中,这些函数用于复制、设置、比较内存区域等,接下来我们来学习一下C语言中常用的内存函数。那么以上就是C语言中常用的内存函数,学完内存函数后,对于复制、设置、比较等操作就不仅仅只局限在字符中了,也可以对任意类型的数据进行复制、设置、比较等操作。

技术不止是工具,也是探索世界的方式 2546

【C语言】内存函数

一篇文章搞定C语言的内存函数!

2403_86779341的博客 1057

【深入详解】C语言内存函数:memcpy、memmove的使用和模拟实现,memset、memcmp函数的使用

当有一块内存空间需要设置内容的时候,就可以使用memset函数,值得注意的是memset函数对内存单元的设置是以字节为单位的。(1)如果要比较2块内存单元的数据的大小,可以使用memcmp函数,这个函数的特点就是可以指定比较长度;(2)memcmp函数是通过返回值告知大小关系的。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 4461

C语言之常用内存函数以及模拟实现

本文主要讲述C语言中常用的内存函数:memcpy、memmove、memset、memcmp。内容不多,除了了解如何使用,我们还会进行模拟实现这些库函数,希望对大家有所帮助。

x_p96484685433的博客 1057

【C语言进阶篇】C语言内存函数

函数顾名思义就是用来设置内存,将需要设置的内存中的值按照字节来设置成想要的内容,使用时也需要包含。的第一个字符是b,在第一个字符就判断出了大小,后面也不用判断了,直接返回了小于0的数。函数是用来拷贝内存的函数,其拷贝的方式为一个字节一个字节地拷贝,使用时需要包含。,则返回一个大于0的数,反之,则返回小于0的数,如果相等,则返回0。型,每个元素的大小为4个字节,因此,拷贝20个字节的内容相当于拷贝了。的方法就可以达到我们上面的目的,但是,这里又会出现一个新的问题,如果。就是我们所要拷贝的数据的起始地。

2301_78022459的博客 1058

C语言-常用内存函数详解+模拟实现

前言:博主之前有已经写过了C语言常用字符函数详解+模拟实现,感兴趣的同学可以去围观一下哦! 目录 前言: 1.内存函数 memcpy() memmove() memcmp() memset() 2.错误信息报告函数 strerror() perror() 1.内存函数 memcpy() 作用:内存拷贝 函数原型: 注意:count:要拷贝的字节数 函数memcpy从src位置开始向后赋值count个字节的数据到dest的内存位置, 遇到 ‘\0’ 的时候..

chuxinchangcun的博客 1140

C语言模拟实现部分库函数

介绍部分字符串库函数的模拟实现,包括strlen,strcpy,strcat,strcmp,strstr,strncpy,strncat,strncmp,memcpy,memmove等函数的模拟实现以及其它字符,字符串和内存库函数的用法介绍

0xFFFFFFFF 1385

深入解析C语言内存函数:从原理到模拟实现

本文介绍 C 语言标准库中四个核心内存操作函数:memcpy(内存拷贝)、memmove(处理重叠内存拷贝)、memset(内存设置)和 memcmp(内存比较)。这些函数通过 void * 指针实现数据类型无关的内存操作,高效灵活。文章重点解析 memcpy 和 memmove 的实现原理,包括处理内存重叠的前向 / 后向拷贝策略,提供模拟实现代码。说明 memset 按字节设置的特性,以及 memcmp 与 strcmp 的区别。这些函数在数据操作、内存初始化等场景中作用显著,是C语言编程的关键工具!

persevereX的博客 2188

C语言字符串与内存库函数的介绍与模拟实现

⭐️前面的话⭐️ ???? 大家好!C语言库中为我们开发者提供了很多实用的函数,我相信不少小伙伴都用过有关字符串和内存的库函数,本文将围绕这两方面介绍有关的库函数并试着模拟实现部分的库函数!读完这篇文章你能学到: ????常见字符串与内存库函数的使用; ????掌握重要库函数的模拟实现。

未见花闻的博客 1186
上一篇: 原码、反码以及补码
下一篇: 结构体大小的计算
Ghosdriver
博客等级 码龄4年 32粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值