首页 > 系统相关 >内存函数详解

内存函数详解

时间:2024-11-21 12:18:43浏览次数:3  
标签:函数 dest 详解 内存 拷贝 memcpy 指针

1. memcpy使⽤和模拟实现

2. memmove使⽤和模拟实现

3. memset函数的使⽤

4. memcmp函数的使⽤

一.memcpy的使用与模拟实现

1.定义:

注意:1.memcpy返回的是目的地的指针

           2.使用时要包含头文件string.h

           3.num指的是拷贝的个数(单位为字节)

2.使用:

3.模拟实现:

ps:这里有一个值得注意的电就是dest=(char*)dest+1可不可以写成dest=(char*)dest++,答案是不合理的,主要是因为后置++的优先级高,所以是先dest++,但dest是一个void*类型,不是完整的指针类型,没有办法给他移动字节

思路整理: 通过对memcpy的学习,我们知道了这是一个用来拷贝数据的函数,并且它本身并不care它要拷贝的数据是什么类型的,所以这里我们传参的时候就要写成void* 的指针,和原函数保持一致,由于我们要用这个函数来实现所有类型数据的拷贝,所以用char*类型的指针来逐个字节进行交换最合适不过了,但void* 的指针不能直接进行解引用,要进行强转,然后在逐个字节进行交换时,两个指针要往后走,至于走到哪,这里就拿while循环来判断,将num作为循环判断条件,当num为0时交换完成,循环正好停止,但是因为强转类型是是临时的,所以这里直接让指针++就不行,还要再次进行强转才可以,这里是比较容易忽视的一个点。并且这个函数还要返回目的地的地址,并且是void*类型的,但是直接在结尾返回dest是有问题的,因为在进行了一系列循环后,指针早就跑远了,这时候我们就可以在开头就先把这个地址传给另一个指针ret,最后在结尾返回指针ret就可以了,这时候这个函数就比较完善了,但因为这里用到了指针,所以在使用之前其实可以先判断一下是否为空指针,这时候就用到了assert,加上这个的话函数就更加健壮了。

4.局限性:

            一般来说,memcpy是不支持拷贝重叠数据的,但在某些系统上却也是可以实现的,但很明显,我上面自己写的这个memcpy如果重叠拷贝的话是会出错的:

我们通过逐个字节来交换来进行拷贝,但比如这里的源头在该取3来进行交换时,这时候其实3已经被1给覆盖了,也就是说这时候你取出的不是3,而是1,所以这时候就出错了啊。

二. memmove使⽤和模拟实现

1.定义:

• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

2.使用:

3.模拟实现:

思路整理: 通过对memmove函数的学习,我们发现这个函数是既可以实现重叠内存的拷贝,也可以实现不相关内存的拷贝,这时候我们在实现这个函数的时候就需要分情况来思考了,我们通过下面这个图来理解:

情况一的时候如果还是先从源头开始拷贝的话就会出现一种现象:在拷贝3的时候,这个3已经被1给覆盖住了,你拿到的不是3而是1,这就出错了啊,所以这个时候我们就需要从末尾开始拷贝,从源头的末尾开始拷贝,依次放到目的地的末尾,这样就可以正确拷贝了


情况二的话是目的地在在源头左边,这个时候就可以从源头开头依次进行拷贝,也就是和上面的my_memcpy道理一样


情况三不属于重叠内存的拷贝,无论是从左还是从右拷贝都可以
既然这样话,我们可以以dest和src的位置来划定情况,当dest在src左边时从左开始拷贝,其他两种情况从右开始拷贝。


这里其实还需要进行解释的一点是在从右开始拷贝的时候怎么找到src和dest的末尾,这里我们通过(char*)dest + num (char*)src + num 分别找到了dest和src的末尾,接着我们通过while循环,并且以num-- 作为循环判断条件,这时候随着num的变化,指向dest和src的指针也跟着移动,从右向左进行交换,当num为0时,交换完成,循环停止。

综上:memmove函数的作用应该是远大于memcpy函数的,但要是更加细分的话,memmove的运行效率在仅仅拷贝不重叠的字符串时是要低于memcpy的,但memmove函数的作用范围明显是比memcpy大的

三. memset函数的使用

1.定义:

简而言之:memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。

ptr:指向要填充的内存块的指针。
‌value:要设置的值(以整数形式传递,但实际会被转换成 unsigned char 类型)。
‌num:要设置的字节数。

2.使用:

memset 用于将一块内存区域中的每个字节都设置为某个给定的值,通常用于初始化数组或者结构体,或者清除内存中的数据

初始化结构体:

四. memcmp函数的使用

1.定义:

2.使用:

标签:函数,dest,详解,内存,拷贝,memcpy,指针
From: https://blog.csdn.net/2403_87691282/article/details/143805670

相关文章

  • 递归之美:C语言中的函数递归
      在编程的世界中,函数递归是一个强大且优雅的概念,它允许一个函数自我调用以解决问题。这种自我调用的特性使得递归在解决某些问题时变得特别高效和直观。本文将深入探讨函数递归的概念、应用以及需要注意的事项。一、递归是什么?        递归是学习C语⾔函数绕不开......
  • 简要描述下什么是回调函数并写一个例子出来
    回调函数是指在另一个函数执行完成后才被调用的函数。它通常作为参数传递给另一个函数,并在该函数内部的某个时刻被执行。在前端开发中,回调函数非常常见,尤其是在处理异步操作(例如网络请求、定时器、事件监听)时。简要描述:想象一下你点了一份外卖。你不会一直站在门口等着,而是告......
  • PlantUML+vscode使用详解
    目录PlantUML使用1.Uml图1.1Uml类图1.2类图关系2.PlantUML功能概述2.1PlantUML核心特性2.2PlantUML的优势3.文本定义语言生成图表PlantUML学习指南4.自动转换c#源码工具4.1CSharptoPlantUML(VisualStudioCode扩展)4.2PlantUmlClassDiagramGeneratorNuget地址安装使用示......
  • Redis 的 Quicklist 技术竟然能让内存占用降低 50%!
    《Redis的Quicklist技术竟然能让内存占用降低50%!》在当今的互联网时代,数据的存储和管理变得至关重要。Redis作为一款高性能的内存数据库,被广泛应用于各种场景中。而Redis的Quicklist技术更是为我们带来了惊喜,据说它能够让内存占用降低50%!那么,Quicklist究竟是何方神圣......
  • MemoryProfiler中Graphics/No Name内存怎么排查
    1)MemoryProfiler中Graphics/NoName内存怎么排查2)通过代码加载出来的Mesh,释放的时候该怎么处理3)动态解析顶点数据加载出来的Mesh还需要做对象池吗4)MeshCollider重刷Bound怎么做这是第410篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力......
  • GE ACC-5595-280 反射内存交换机 八口 单模 传输距离10km
    多模反射内存交换机:实现高速实时数据共享的关键设备在当今数字化、信息化的时代,数据的快速传输和实时共享对于许多领域的系统运行至关重要。多模反射内存交换机作为一种先进的网络设备,为满足这些需求提供了高效、可靠的解决方案。多模反射内存交换机是一种专门设计用于反射内存......
  • 最全亚马逊批量实时采集商品链接方法(图文详解),还能看市场集中度!
    第一步:准备关键词、类目ID、店铺ID、ASIN可以通过选关键词、选类目2种方式采集关键词,自己卡条件批量下载下来。第二步:了解以词挖品、类目top1万采集、畅销榜采集、店铺挖品、僵尸链接、asin采集等等以词挖品方法一以词挖品方法二以词挖品方法三以词挖品方法四......
  • HarmonyOS Next加解密算法中的参数与模式详解
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)中加解密算法参数与模式的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、加解密参数......
  • 内存映射文件
    内存映射文件内存映射文件简介内存映射文件(Memory-MappedFile)是一种将文件或其他对象映射到进程地址空间的机制,使得应用程序可以像访问内存一样访问文件内容。以下是内存映射文件的主要特点和工作原理:主要特点直接内存访问:应用程序可以通过指针直接访问文件内容,而不需要通......
  • 详解线程的三大特性:原子性、可见性和有序性
    在多线程编程中,理解线程的原子性、可见性和有序性是构建正确并发程序的基础。以下是它们的详细解释:1.原子性(Atomicity)定义原子性指的是操作不可被中断,要么全部执行完成,要么完全不执行。特性原子性操作在执行时不会被其他线程干扰。如果多个线程同时访问共享资......