C语言——内存函数介绍和模拟实现

之前我们讲过一些字符串函数(http://t.csdnimg.cn/ZcvCo),今天我们来讲一讲几个内存函数,那么可能有人要问了,都有字符串函数了,怎么又来个内存函数,这不是一样的么?

我们要知道之前的字符串函数只能对字符串进行一系列操作很是局限,这次的内存函数就不一样了,内存函数的范围就很广了,它可以对数组啊,或者是结构体进行操作了。

memcpy函数

它是一个内存拷贝函数,类似于字符串函数strcpy。

memcpy的头文件是<string.h>

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

1、上面的例子就是两个数组,传的也是整形,所以就不能用strcpy,所以就体现了memcpy的重要性和通用性。

2、这个num一定要注意是字节的大小,所以上面的例子传了5个整数int,所以字节大小就是20。

 那么我们该如何对他进行模拟实现呢?🤔🤔🤔

void* my_memcpy(void* dest,void* src,size_t sz) {assert(dest && src);void* ret = destwhile (sz--) {*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src + 1;}return ret;
}int main() {int arr1[10] = { 0 };int arr2[] = { 1,2,3,4,5 };my_memcpy(arr1, arr2, 20 );return 0;
}

这里我们进行了一个模拟实现:

1、首先我们因为要考虑传的参数都可能不同,所以为了通用性,我们这里用void*来接受各种类型的指针。

2、其次当进行拷贝的时候,由于是一个字节一个字节进行的,所以我们只能转换成(char*)来进行交换。

3、交换完之后,我们还需要将dest和src进行后移,移动到下一个字节待交换,因为强制类型转换是临时性的,所以这里在进行移动的时候还需要进行一次强制类型转换。

4、sz是总字节大小,所以用做循环的变量,来控制循环。

memmove函数

 刚刚的memcpy函数是用来进行,两个之间的拷贝,那么这个memove函数是用来进行同一个内存块的拷贝。

int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr+2, arr, 12 );return 0;
}

 思考memmove的模拟实现

但是这个思路到底能否实现呢?🤔🤔🤔 

那么只是用从后向前拷贝就可以解决所有问题么? 

所以这个我们就要进行分类讨论了 

 

可以看到上面这个图,我们可以看到,最后通过我们的分析可以知道,我们当dest<src时要进行从前向后拷贝,dest>src时要进行从后向前拷贝。

那么我们来实现一下代码:

void* my_memmove(void* dest, void* src, size_t sz) {assert(dest && src);void* ret = dest;while (sz--) {if (dest < src) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}else {*((char*)dest + sz) = *((char*)src + sz);}}return ret;
}
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr+2, arr, 12 );return 0;
}

我们用while循环sz为循环变量,当dest<src的时候我们就将其正常拷贝就可以了 ,否则的话我们用dest和src分别加sz就到了数组的后面,然后随着sz的递减,我们就实现了从后向前拷贝。

 

 memset函数

这个函数可以将内存块进行指定更改,例如:

我们可以看到arr代表首元素地址,所以从数组第一个1开始,向后的12个字节,也就是3个int整形,所以我们看到内存里面的前三个被替换成了0。

另外也可以替换字符串

int main() {char arr[] = { "Hello world" };memset(arr+6 ,'x', 3);printf("%s", arr);return 0;
}

 我们可以替换字符串就像这样

但是当用这个函数的时候有一个点:

int main() {int arr[] = { 1,2,3,4,5,6 };memset(arr+1 ,1, 8);return 0;
}

 这个函数我们想要把2,3也都变成1,但是我们运行结果却不是

我们发现并不是更改成了1,当我们用16进制看的时候会发现:

它是将每一个字节都更改成了1,所以导致最后的值很大。 

 

 memcmp函数

可以看到,由于memcmp是按照字节比较的所以,当我们取前三个元素的字节时,arr1和arr2都是一样的,所以输出结果就是0。

但是当我改成:

07比04大所以,arr2大于arr1返回的是小于0的值。 

 感谢大家的观看!!!我们下次再见🌹🌹🌹

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

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

相关文章

Android问题记录

一 Android编程怎样用ICC校准颜色&#xff1f; 在Android编程中&#xff0c;ICC颜色校准通常是通过使用Color Management API进行的。以下是使用ICC校准颜色的步骤&#xff1a; 首先&#xff0c;确保你的设备支持色彩管理。你可以通过调用ColorManagement.isColorManagementSu…

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布!不依赖 Linux 内核

华为原生 HarmonyOS NEXT 鸿蒙操作系统星河版 发布&#xff01;不依赖 Linux 内核 发布会上&#xff0c;余承东宣布&#xff0c;HarmonyOS NEXT鸿蒙星河版面向开发者开放申请。 申请链接 鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原…

MATLAB Fundamentals>>>Fill Missing Values

MATLAB Fundamentals>Preprocessing Data>Interpolating Missing Data> (1/4) Fill Missing Values This code sets up the activity. x [0 NaN 7 8 NaN 2 -3 NaN -8] plot(x,"s-","LineWidth",1.5) 任务1&#xff1a; Create a vector y th…

04 思维导图的方式回顾ospf

思维导图的方式回顾OSPF 1 ospf 领行学习思维导图 1.1 ospf 的工作过程 建立领据表同步数据库计算路由表1.2 ospf 的状态 1.3 ospf的报文 1.4 ospf的L

Arduino开发实例-LJ12A3-4-Z/BX 电感式接近传感器驱动

LJ12A3-4-Z/BX 电感式接近传感器驱动 文章目录 LJ12A3-4-Z/BX 电感式接近传感器驱动1、LJ12A3-4-Z/BX 电感式接近传感器介绍2、硬件准备及接线3、代码实现1、LJ12A3-4-Z/BX 电感式接近传感器介绍 接近传感器用于检测附近物体的存在。 LJ12A3-4-Z / BX 传感器有三个引脚,其中两…

ant-desgin的table的上移、下移

文章目录 html部分函数部分 html部分 <a-table :columns"columns" :data-source"dataList" :loading"listLoading" :pagination"false"><template #bodyCell"{ column, record, index }"><template v-if&qu…

修改并配置flutter不同平台的启动图标,很方便就可以修改,全平台支持

Flutter 启动器图标-一个包&#xff0c;简化了更新您的 Flutter 应用程序的启动器图标的任务。完全灵活&#xff0c;允许您选择什么平台&#xff0c;您希望更新的启动器图标&#xff0c;如果你想&#xff0c;选项保留您的旧启动器图标&#xff0c;以防您想恢复到未来的某个时候…

【腾讯云】您使用的腾讯云服务存在违规信息,请尽快处理

收到【腾讯云】您使用的腾讯云服务存在违规信息&#xff0c;请尽快处理&#xff0c;如何解决&#xff1f;在腾讯云服务器部署网站提示网站有违规信息如何处理&#xff1f;腾讯云百科txybk告诉各位站长&#xff0c;在腾讯网址安全中心申诉&#xff0c;申诉通过后截图上传给腾讯云…

Github操作网络异常笔记

Github操作网络异常笔记 1. 源由2. 解决2.1 方案一2.2 方案二 3. 总结 1. 源由 开源技术在国内永远是“蛋疼”&#xff0c;这些"政治"问题对于追求技术的我们&#xff0c;形成无法回避的障碍。 $ git pull ssh: connect to host github.com port 22: Connection ti…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

02--数据库事务

1、数据库事务 1.1 数据库事务介绍 事务&#xff1a;一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有事务都作为一个工作单元来执行&#xff0c;即使出现了故障&#xff0c;都不能改变这种执行方式。当…

一句话讲清楚什么是CUDA,人人都能听懂的CUDA概念

通俗地说&#xff0c;CUDA是一种协助“CPU任务分发GPU并行处理”的编程模型/平台&#xff0c;用于加速GPU和CPU之间的计算。 也就是说CUDA通过CPU任务分发和GPU并行处理的方式&#xff0c;把计算任务通过CPU分发给GPU进行并行计算加速。而GPU并行计算的能力需要CUDA借助其自带…

axios query传数组参数的格式

在 Axios 中&#xff0c;当你需要传递数组参数时&#xff0c;可以使用以下几种方式进行格式化&#xff1a; 使用 paramsSerializer 将数组转换为逗号分隔的字符串&#xff1a; import axios from axios;import qs from qs;const arrayParams [param1, param2, param3];axios.…

Elasticsearch 中的 term、terms 和 match 查询

目录 term 查询 terms 查询 match 查询 注意事项 结论 Elasticsearch 提供了多种查询类型&#xff0c;用于不同的搜索需求。term、terms 和 match 是其中最常用的一些查询类型。下面分别介绍每种查询类型的用法和特点。 term 查询 term 查询用于精确值匹配。它通常用于关…

Java集合框架的基本接口

Java集合框架的基本接口主要包括以下几种&#xff1a; Collection&#xff1a;这是所有集合的根接口&#xff0c;定义了一些基本的操作&#xff0c;如添加、删除、检查元素等。 Set&#xff1a;Set 是一个不包含重复元素的集合。此接口的主要目的是确保元素的唯一性。 List&am…

Flash读取数据库中的数据

Flash读取数据库中的数据 要读取数据库的记录&#xff0c;首先需要建立一个数据库&#xff0c;并输入一些数据。数据库建立完毕后&#xff0c;由Flash向ASP提交请求&#xff0c;ASP根据请求对数据库进行操作后将结果返回给Flash&#xff0c;Flash以某种方式把结果显示出来。 …

鸿蒙星河版启航,开发者驶入生态新征程

操作系统市场的气候已经不同以往。在鸿蒙决定不再兼容安卓之后&#xff0c;这里正欲长出一片全新的天地。 四年前&#xff0c;华为鸿蒙系统横空出世&#xff0c;彼时它还不完全与安卓和iOS的性质划等号&#xff0c;而是定义为物联网操作系统。而如今的华为鸿蒙要改写故事篇章&…

结构体(C语言)

结构体 1.结构体基础知识: //结构是一些值的集合,这些值称为成员变量. // 结构的每个成员可以是不同类型的变量. 2.结构的定义 struct peo { char name[10];//姓名 char tele[12];//电话 char gender[5];//性别 int high;//身高 }; struct stu { struct…

c语言复习:常见函数与错误

常用函数 1.pow int pow(m,n) {int j,s1;for(j1;j<n;j){s*m;}return s; }2.快速排序(stdlib) int main() {int arr[10] {9,8,7,6,5,4,3,2,1};int sz sizeof(arr) / sizeof(arr[0]);qsort(arr,sz,sizeof(arr[0]),cmp); } int cmp(const void* a,const void* b) {return …

ctfshow反序列化(web254-web266)

目录 web254 web255 web256 web257 web258 web259 web260 web261 web262 web263 web264 web265 web266 web254 源码 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020…