c语言内存函数的深度解析

 

本章对 memcpy,memmove,memcmp 三个函数进行详解和模拟实现;

本章重点:3个常见内存函数的使用方法及注意事项并学会模拟实现;

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!!

1.memcpy函数(内存拷贝函数)

函数介绍 

1.memcpy函数的作用:从source的位置开始向后复制num个字节的数据到destination的内存位置。 可以拷贝字符数组,整型数组,结构体等等,所以参数是void* 的指针;
2.这个函数在遇到 '\0' 的时候并不会停下来。(注意)
3.memcpy函数的局限:如果source和destination有任何的重叠,复制的结果都是未定义的。
memcpy函数拷贝不重叠的内存的拷贝。
4.拷贝结束,返回目标空间的起始地址。

使用举例:

memcpy的模拟实现:

void* 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);
}

就是将源内容一个一个字节的拷贝到目标空间去,所以强制类型转换成char*;

2.memmove函数(内存移动函数)

函数介绍 

memcpy和memmove函数的用法一样;作用有所差别;

1.memmove函数不仅可以拷贝不重叠的内存,而且可以拷贝重叠的内存。

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

memmove的使用示例

 当memmove函数用来拷贝重叠内存

memmove函数的模拟实现

void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)){while (count--){*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {dst = (char*)dst + count - 1;src = (char*)src + count - 1;while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst - 1;src = (char*)src - 1;}}return(ret);
}

解析:

例如
将arr[]={1,2,3,4,5,6,7,8,9,10}中的1 2 3 4 5 放到3 4 5 6 7的位置上去,如果我们还是用前面memcpy的思想
第一步:把1放到3上去,变为1 2 1 4 5 6 7 8 9 10
第二步:把2放到4上去,变为1 2 1 2 5 6 7 8 9 10
第三步:我们需要将3放到5上去,但是,第一步我们已经将3改变了,所以这种思想不行;

memmove模拟实现思想:


 

3.memcmp函数(内存比较函数)

函数介绍

比较从ptr1和ptr2指针开始的num个字节

返回值如下:

使用示例代码:

int main()
{char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0){printf("'%s' is greater than '%s'.\n", buffer1, buffer2);}else if (n < 0){printf("'%s' is less than '%s'.\n", buffer1, buffer2);}else{printf("'%s' is the same as '%s'.\n", buffer1, buffer2);}return 0;
}

运行结果:

本章完~


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

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

相关文章

el-table数据处理

在写表格时遇到&#xff0c;后端返回的数据是对象&#xff0c;并且缺少字段 1.每一条数据加上 一个字段 2.将对象转成数组 以下是数据 {"groupA": {"groupName": null,"orgName": null,"orgId": null,"allPeoper": &quo…

C# 泛型(Generic)

方法重载&#xff1a;方法名称相同&#xff0c;参数个数和参数类型不同&#xff1b; 优势&#xff1a;可以节约方法名称 劣势&#xff1a;方法过多 语法&#xff1a;public void writeContent(T t) 原理&#xff1a;普通的C#代码他是运行在前端进行编译&#xff0c;所有的类型需…

IntersectionObserver实现小程序长列表优化

IntersectionObserver实现小程序长列表优化 关于 IntersectionObserver 思路 这里以一屏数据为单位【一个分页的10条数据&#xff0c;最好大于视口高度】&#xff0c; 监听每一屏数据和视口的相交比例&#xff0c;即用户能不能看到它 只将可视范围的数据渲染到页面上&#x…

[Spring]Spring声明式事务总结

文章目录 1、介绍2、Spring事务的隔离级别3、事务的传播行为4、Transactional注解包含的属性5、使用6、Transactional失效场景 1、介绍 声明式事务管理是建立在 AOP 之上的。其本质是通过 AOP 功能&#xff0c;对方法前后进行拦截&#xff0c;将事务处理的功能编织到拦截的方法…

Oracle 19c 报ORA-704 ORA-01555故障处理---惜分飞

异常断电导致数据库无法启动,尝试对数据文件进行recover操作,报ORA-00283 ORA-00742 ORA-00312错误,由于redo写丢失无法正常应用 D:\check_db>sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on 星期日 7月 30 07:49:19 2023 Version 19.3.0.0.0 Copyrig…

利用读时建模等数据分析能力,实现网络安全态势感知的落地

摘要&#xff1a;本文提出一种基于鸿鹄数据平台的网络安全态势感知系统&#xff0c;系统借助鸿鹄数据平台读时建模、时序处理、数据搜索等高效灵活的超大数据存储和分析处理能力&#xff0c;支持海量大数据存储、分类、统计到数据分析、关联、预测、判断的网络安全态势感知能力…

FastAPI 5 - 依赖、安全

文章目录 一、Dependencies 依赖注入1、函数作为依赖2、类作为依赖3、多次依赖4、同时依赖多个二、安全、授权2、获取当前用户3、密码验证、令牌使用4、JWT 令牌、哈希加密学习自:FastAPI教程第二季(三):依赖+安全(最快python异步并发web框架之一) https://www.bilibili.…

PID模块化__以stm32直流电机速度为例

文章目录 前言一、相关PID源码.c.h 二、如何使用1.创建变量2.初始化3.运算4.修改pid参数 总结 前言 本篇使用到的基于这个STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式 由于上次使用的pid没有模块化&#xff0c;当多出使用pid的时候就会很麻烦 所以…

CentOS7系统Nvidia Docker容器基于TensorFlow2.12测试GPU

CentOS7系统Nvidia Docker容器基于TensorFlow1.15测试GPU 参考我的另一篇博客 1. 安装NVIDIA-Docker的Tensorflow2.12.0版本 1. 版本依赖对应关系&#xff1a;从源代码构建 | TensorFlow GPU 版本Python 版本编译器构建工具cuDNNCUDAtensorflow-2.6.03.6-3.9GCC 7.3.1Ba…

beego通过gorm访问mysql数据库

一、下载golang 二、解压下载包到C盘 三、配置golang系统环境变量 四、进入新建的工作目录C:\project下载并安装beego 五、将新生成的bee.exe所在的路径c:\project\bin加入到系统变量path里面 六、下载并安装mysql 例如在上图中&#xff0c; 选“No thanks,just start my down…

如何在3ds max中创建可用于真人场景的巨型机器人:第 3 部分

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 创建腿部装备 步骤 1 打开 3ds Max。 打开在本教程最后一部分中保存的文件。 打开 3ds Max 步骤 2 转到创建> 系统并单击骨骼。 创建>系统 步骤 3 为的 侧视口中的腿&#xff0c;如下图所示…

Java 程序员:本是为了跳槽刷完 1000 道真题,想不到被老板知道直接给我升职

同事&#xff1a;前阵子听说你要跳槽&#xff0c;现在准备得怎么样啊&#xff1f; 程序员 T&#xff1a;不跳了 同事&#xff1a;啊&#xff1f;为什么&#xff1f; 程序员 T&#xff1a;涨薪了呗&#xff1f; 同事&#xff1a;真的吗&#xff1f;涨了多少&#xff1f;你自…

R语言无法调用stats.dll的问题解决方案[补充]

写在前面 在去年10月份&#xff0c;出过一起关于R语言无法调用stats.dll的问题解决方案,今天&#xff08;你看到后是昨天&#xff09;不知道为什么&#xff0c;安装包&#xff0c;一直安装不了&#xff0c;真的是炸裂了。后面再次把R与Rstuido升级。说实话&#xff0c;我是真不…

flutter 图片相关

官方链接&#xff1a;https://api.flutter.dev/flutter/widgets/Image-class.html 图片基本使用 显示本地图片时,要在pubspec.yaml文件里面添加如:(注意空格) assets: - assets/images/logo.png Fit属性&#xff1a; BoxFit.cover最常用 显示可能拉伸&#xff0c;可能裁…

etcd入门和常用操作

概述 etcd 是一个高可用的分布式键值&#xff08;key-value&#xff09;数据库&#xff0c;采用了更为简洁的Raft共识算法来实现数据强一致。基于Go语言实现&#xff0c;主要用于共享配置和服务发现。 名称说明 名称说明etcd一种基于 raft 协议的分布式 kv 数据库&#xff0…

秋招算法备战第31天 | 贪心算法理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法理论基础 贪心算法并没有固定的套路&#xff0c;唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。如何验证可不可以用贪心算法呢&#xff1f;最好用的策略就是举反例&#xff0c;如果想不到反例&#xff0c;那么就试一试贪心吧。刷题或者面试的时候&#xf…

C语言指针详解

C语言指针详解 字符指针1.如何定义2.类型和指向的内容3.代码例子 指针数组1.如何定义2.类型和内容 数组指针1.如何定义2.类型和指向类型3.数组名vs&数组名数组指针运用 数组参数&指针参数一维数组传参二维数组传参一级指针传参二级指针传参 函数指针1.如何定义2.类型和…

Java ~ Collection/Executor ~ DelayQueue【总结】

前言 文章 相关系列&#xff1a;《Java ~ Collection【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Collection/Executor ~ DelayQueue【源码】》&#xff08;学…

transformer从开始到结束

首先输入是64 * 10的矩阵,代表64个句子,每个句子10个词。 X = self.positionalEncoding(self.embedding(X)*math.sqrt(self.num_hiddens))在经过embeddeding之后,变为64 * 10 *32 矩阵,每个词使用32维向量表示。然后将数据放入 X = encoder_block(X,valid_lens),这里我们将…

Elasticsearch笔记

迈向光明之路&#xff0c;必定荆棘丛生。 文章目录 一、Elasticsearch概述二、初识ES倒排索引1. 正向索引2. 倒排索引 三、ES环境搭建1. 安装单机版ES2. 安装Kibana3. 安装ik分词器3.1 在线安装ik插件3.2.离线安装ik插件&#xff08;推荐方式&#xff09;3.3 自定义词典 四、ES…