C语言中的内存函数你知道多少呢?

目录

 ​编辑

1. memcpy的使用和模拟实现

1.1函数介绍

​编辑

1.2函数的使用

1.3模拟实现

2. memmove的使用和模拟实现

2.1函数介绍

2.2函数的使用

2.3模拟实现

3. memset函数的使用

3.1函数介绍

3.2函数的使用

​编辑

4. memcmp函数的使用

4.1函数介绍

4.2函数的使用

完结散花


 

                           不是每个人都能做自己想做的事,成为自己想成为的人。

                                                  克心守己,律己则安

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~ 

1. memcpy的使用和模拟实现

1.1函数介绍

注:使用该函数需要引用头文件#include<string.h> 

1.2函数的使用

假设我们要将arr1中的前20个字节拷贝到数组arr2中~

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

 运行效果如下~

我们可以看到屏幕上打印了1 2 3 4 5 ~怎么样,使用是不是很简单呢?

1.3模拟实现

那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~

.  模拟实现之前我们还要了解一下指针类型void*

.  当我们无法确定传递过来的实参的指针是什么类型时,我们就可以用void*来接受

.  但我们还要知道的一点是对于指针void*,我们无法对其进行指针运算

void* my_memcpy(void* dest, const void* src, size_t num)
{assert(dest && src);//判断指针的有效性void* ret = dest;//用ret记录dest目标函数的起始位置while (num--){//强制类型转化为char*对其进行指针运算*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;//*((char*)dest)++ = *((char*)src)++;这种写法在VS2022上可行,但不能确保所有编译器上都可行}return ret;
}

2. memmove的使用和模拟实现

2.1函数介绍

2.2函数的使用

int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memmove(arr1+2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

我们来看一下运行效果~

2.3模拟实现

那让我们模拟实现一下这个函数,相信我们会对其有更加深刻的理解呢~

void* my_memmove(void* dest, const void* src, size_t num)
{assert(dest && src);void* ret = dest;if (src>dest)//从前往后复制{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else//从后往前复制{dest = (char*)dest + num-1;src = (char*)src + num-1;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest - 1;src = (char*)src - 1;}//while (num--)//{//	*((char*)dest + num) = *((char*)src + num);//}这样写也行}return ret;
}

 算法的图解放在下面啦~

3. memset函数的使用

3.1函数介绍

3.2函数的使用

int main()
{int arr[10] = { 0 };memset(arr, 1, 20);return 0;
}

调试我们看一下效果~

是不是很简单呢~


4. memcmp函数的使用

4.1函数介绍

4.2函数的使用

int main()
{int arr1[10] = { 1,2 };int arr2[10] = { 1,3 };printf("前4个字节比较%d\n", memcmp(arr1, arr2, 4));printf("前5个字节比较%d\n", memcmp(arr1, arr2, 5));printf("前8个字节比较%d\n", memcmp(arr1, arr2, 8));return 0;
}

我们来看一下运行效果~

完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

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

相关文章

漏电流的检测要求和理解

漏电流的检测要求和理解 简介漏电流的产生和效应标准要求漏电流的试验漏电流与电磁兼容的关系小结 简介 漏电流是指非功能性电流&#xff0c;是非期望的会引起安全方面危险的电流。漏电流表明了设备中电气绝缘起到防电击作用具有的性能&#xff0c;以使穿过电气绝缘的电流控制…

基于spring cloud alibaba的微服务平台架构规划

平台基础能力规划&#xff08;继续完善更新…&#xff09; 一、统一网关服务&#xff08;独立服务&#xff09; 二、统一登录鉴权系统管理&#xff08;独立服务&#xff09; 1.统一登录 2.统一鉴权 3.身份管理 用户管理 角色管理 业务系统和菜单管理 部门管理 岗位管理 字典管…

3D Slicer-最强大的开源医学图像分割工具简要概述

3D Slicer-最强大的开源医学图像分割工具简要概述 本系列涵盖从 3D Slicer 医学图像查看器的基础使用到高级自动分割扩展程序的内容&#xff08;从入门到高阶&#xff01;&#xff09;&#xff0c;具体包括软件安装、基础使用教程&#xff0c;自动分割扩展&#xff08;totalse…

CTFshow web(php命令执行 37-40)

?ceval($_GET[shy]);&shypassthru(cat flag.php); #逃逸过滤 ?cinclude%09$_GET[shy]?>&shyphp://filter/readconvert.base64-encode/resourceflag.php #文件包含 ?cinclude%0a$_GET[cmd]?>&cmdphp://filter/readconvert.base64-encode/…

NLP_Seq2Seq编码器-解码器架构

文章目录 Seq2Seq架构构建简单Seq2Seq架构1.构建实验语料库和词汇表2.生成Seq2Seq训练数据3. 定义编码器和解码器类4.定义Seq2Seq架构5. 训练Seq2Seq架构6.测试Seq2Seq架构 归纳Seq2Seq编码器-解码器架构小结 Seq2Seq架构 起初&#xff0c;人们尝试使用一个独立的RNN来解决这种…

Page246~250 11.1GUI下的I/O基础

11.1.1 从“控制台”说起 “命令行交互界面”&#xff08;简称CUI,也有人称为CLI)。 CUI需要我们记忆并在控制台输入命令文本内容&#xff0c;而GUI则以图形的方式呈现、组织各类命令&#xff0c;比如Windows的“开始”菜单&#xff0c;用户只需通过简单的键盘或鼠标操作&am…

登录+JS逆向进阶【过咪咕登录】(附带源码)

JS渗透之咪咕登录 每篇前言&#xff1a;咪咕登录参数对比 captcha参数enpassword参数搜索enpassword参数搜索J_RsaPsd参数setPublic函数encrypt加密函数运行时可能会遇到的问题此部分改写的最终形态JS代码&#xff1a;运行结果python编写脚本运行此JS代码&#xff1a;运行结果&…

hummingbird,一个非常好用的 Python 库!

前言 随着人工智能和机器学习的快速发展&#xff0c;将训练好的模型部署到生产环境中成为了一个重要的任务。而边缘计算设备&#xff0c;如智能手机、嵌入式系统和物联网设备&#xff0c;也需要能够运行机器学习模型以进行实时推理。Python Hummingbird 是一个强大的工具&…

【图形学】投影和消隐简介

投影 正交投影 对于物体上任意一点的三维坐标P(x,y,z),投影后的三维坐标为 P ′ ( x ′ , y ′ , z ′ ) P^\prime(x^\prime,y^\prime,z^\prime) P′(x′,y′,z′),那么正交投影的方程为 { x ′ x y ′ y z ′ 0 \begin{cases} x^\primex\\y^\primey\\z^\prime0 \end{case…

做跨境电商需要使用住宅代理IP吗?

住宅代理IP是近年来跨境电商领域日益受到重视的技术工具&#xff0c;不仅可以保护隐私、优化网络速度&#xff0c;还能助推跨境电商的精细化管理。接下来&#xff0c;我们将深入探讨利用住宅代理IP如何为跨境电商业务带来竞争优势。 一、住宅代理IP与跨境电商 住宅代理IP&…

flex:1最后一行或者只有一行时不想占满整行

flex:1最后一行或者只有一行时不想占满整行 问题解决方法注意 问题 在设置flex1的时候&#xff0c;如果内容只有一行或者多行的最后一行的时候&#xff0c;往往最后一行会占满整行&#xff0c;导致项目比其他行宽&#xff0c;比如&#xff1a; 解决方法 这时候我们可以使用…

2.3_9 吸烟者问题

2.3_9 吸烟者问题 问题描述 问题分析 假设一个系统有三个抽烟者进程和一个供应者进程。每个抽烟者不停地卷烟并抽掉它&#xff0c;但是要卷起并抽掉一支烟&#xff0c;抽烟者需要有三种材料&#xff1a;烟草、纸和胶水。三个抽烟者中&#xff0c;第一个拥有烟草、第二个拥有纸…