内存函数及其模拟实现

身体扛不住的时候,意志会带你杀出重围

文章目录

一、memcpy函数

函数介绍

模拟实现

二、memmove函数

函数介绍

模拟实现

三、memset函数

函数介绍

模拟实现


大家好,我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。 

一、memcpy函数

函数介绍

  memcpy是内存拷贝函数,可以以字节为单位,将一块内存的地址拷贝至另一块内存,因为是以字节为单位进行拷贝,所以任何数据类型都能拷贝,但是memcpy函数的两块地址不能重叠,一旦重叠,可能会出现一些很难预料的结果。

  memcpy函数的第一个参数是目标内存的首地址,第二个参数是要拷贝内存的首地址,第三个参数是需要拷贝的字节数,因为拷贝源的内存空间里的内容不会改变,所以加const修饰,提高函数的安全性。

模拟实现

  在模拟实现memcpy函数的时候,只需要将对应位置的字节交换即可,因为参数传过去的是空指针,所以要先强制类型转化为char* 类型,再进行解引用和赋值,

#include<assert.h>
char* my_memcpy(void* dest,const void* src, size_t num)
{assert(dest && src);char* ret = dest;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}int main()
{int arr1[10] = { 0,1,2,3,4,5,6,7,8,9 };int arr2[5] = { 11,12,13,14,15 };char*st=my_memcpy(arr1, arr2, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

  在这段代码中,arr1与arr2的内存是单独存在的,他们的内存没有重叠,可是,当将arr1改为arr1+3时,,arr2改为arr1时,预期结果应该是变为{0 1 2 0 1 2 3 4 8 9},可实际在操作的过程中却变成了{0 1 2 0 1 2 0 1 8 9}。这就是他们两块空间内存有重叠的原因。

  为了解决这个问题,我们大多数会使用另一个函数memmove。

二、memmove函数

函数介绍

  memmove函数可以将一块内存的内存移动至另一块,也类似于拷贝函数(memcpy)的功能,但它相较于memcpy函数多了可以处理重叠内存空间的内存拷贝功能。

它的功能与理想中的拷贝内存空间的strcpy函数相同,就不做过多赘述 

模拟实现

  通过简单的测试可以得到,当目标内存的空间在源内存空间的后面时,用上面实现strcpy函数的方法从初始位置一个一个拷贝是可以实现目的的,如图

  如果目标内存的空间在源内存空间的前面时,不能达到理想的结果

  所以,对于目标内存的空间在源内存空间前面的情况,我们可以从内存空间的后面往前拷贝、

  总结, 当目标空间位于源空间前面的时候,要从后往前拷贝;当目标空间位于源空间之前的时候,要从前往后拷贝。在函数中用if...else语句来控制即可。

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

三、memset函数

函数介绍

  memset函数的作用是以字节为单位改数据。

void* my_memset(void* ptr, int value, int num)
{int i = 0;for (i = 0; i < num; i++){*((char*)ptr+i) = value;}return (char*)ptr;
}
int main()
{int arr[10] = { 0 };my_memset(arr, 'x', 39);printf("%s",(char*)arr);return 0;
}

   memest函数的第一个参数是被改数据的首地址,第二个参数是要改成的内容(整形家族),第三个参数是要改的字节数。

  虽然arr是整形数组,但通过memset函数可以以字节为单位,将它的每个字节的数据都改为字符型数据,所以memset函数的第二个参数只要是整形家族即可。

模拟实现

void* my_memset(void* ptr, int value, int num)
{int i = 0;for (i = 0; i < num; i++){*((char*)ptr+i) = value;}return (char*)ptr;
}
int main()
{int arr[10] = { 0 };my_memset(arr, 'x', 39);printf("%s",(char*)arr);return 0;
}

在这里插入图片描述

  博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰     裤    辣 !!!

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

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

相关文章

20.matlab数据分析极限(matlab程序)

1.简述 计算极限 MATLAB提供计算极限的limit函数。在其最基本的形式中&#xff0c;limit函数将表达式作为参数&#xff0c;并在独立变量为零时找到表达式的极限。 例如&#xff0c;要计算函数f(x)(x^3 5)/(x^4 7)的极限&#xff0c;因为x趋向于零。 syms xlimit((x^3 5)/…

day42-servlet下拉查询/单例模式

0目录 1.Servlet实现下拉查询&#xff08;两表&#xff09; 2.单例模式 1.实战 1.1 创建工程&#xff0c;准备环境... 1.2 接口 1.3 重写方法 1.4 servlet 1.5 list.jsp list.jsp详解 2.单例模式 2.1 饿汉模式&#xff1a;在程序加载时直接创建对象&#…

学习系统编程No.32【线程互斥实战】

引言&#xff1a; 北京时间&#xff1a;2023/7/19/15:22&#xff0c;昨天更新完博客&#xff0c;和舍友下了一会棋&#xff0c;快乐就是这么简单&#xff0c;哈哈哈&#xff01;总体来说&#xff0c;摆烂程度得到一定的改善&#xff0c;想要达到以前的水准&#xff0c;需要一定…

UTM 4.3 发布:在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS

UTM 4.3 发布&#xff1a;在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS 在 iOS 中虚拟化 Windows、Linux 和 Unix 请访问原文链接&#xff1a;https://sysin.org/blog/utm-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

题目&#xff1a; 有一个数字矩阵&#xff08;二维数组&#xff09;&#xff0c; 矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c; 请编写程序在这样的矩阵中查找某个数字是否存在&#xff0c; 要求&#xff1a;时间复杂度小于O(N)。 思路&#xff1…

《零基础入门学习Python》第057讲:论一只爬虫的自我修养5:正则表达式

如果你在课后有勤加练习&#xff0c;那么你对于字符串的查找应该是已经深恶痛绝了&#xff0c;你发现下载一个网页是很容易的&#xff0c;但是要在网页中查找到你需要的内容&#xff0c;那就是困难的&#xff0c;你发现字符串查找并没有你想象的那么简单&#xff0c;并不是说直…

(已解决)RuntimeError: Java gateway process exited before sending its port number

今天用Pycharm远程使用pysaprk解释器时&#xff0c;跑代码出现了这个错误&#xff1a; RuntimeError: Java gateway process exited before sending its port number 找了好多博客都没解决问题&#xff0c;有说重装spark的&#xff0c;有说本地配Java_home的&#xff0c;后面我…

leetcode 47. 全排列 II

2023.7.23 这道题是上一题全排列 的一个升级版。 唯一区别就是需要增加一个树层去重的操作&#xff0c;因为数组nums中允许有重复的元素了&#xff0c;而上一题没有重复元素。 下面看代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<…

如何评测一个大语言模型?

编者按&#xff1a;大型语言模型&#xff08;Large language models, LLMs&#xff09;因其在学术界和工业界展现出前所未有的性能而备受青睐。随着 LLMs 在研究和实际应用中被广泛使用&#xff0c;对其进行有效评测变得愈发重要。近期已有多篇论文围绕大模型的评测进行研究&am…

RocketMQ教程-(4)-领域模型-消费者分组ConsumerGroup

定义​ 消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。 和消费者不同&#xff0c;消费者分组并不是运行实体&#xff0c;而是一个逻辑资源。在 Apache RocketMQ 中&#xff0c;通过消费者分组内初始化多个消费者实现消费性能的水平扩展以…

【云原生】Docker网络及Cgroup资源控制

一、Docker网络 1.docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。…

微信小程序——页面跳转方法和场景用法总结

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

如何理解spring cloud 和 spring cloud Alibaba

Spring Cloud是一个基于Spring Framework构建的用于开发和构建分布式系统的开源框架。它提供了一系列的工具和组件&#xff0c;用于帮助开发者快速构建、部署和管理微服务架构。Spring Cloud提供了包括服务发现、配置管理、负载均衡、断路器等在内的众多功能。 Spring Cloud A…

【JVM】JVM执行流程 JVM类加载 垃圾回收机制等

目录 &#x1f337;1、JVM是什么&#xff1f; &#x1f337;2、JVM的执行流程&#xff08;能够描述数据区5部分&#xff09; &#x1f337;3、JVM类加载过程 &#x1f337;4、双亲委派机制&#xff1a;描述类加载的过程 问题1&#xff1a;类加载器 问题2&#xff1a;什么…

支付宝原生小程序组件与父级传递数据(微信小程序基本一样)

1. 声明组件 在对应的目录下,右击点击 新建小程序,之后会生成对应的文件 2. 子组件 Component({data: {colorList: [#165FF6, #3D16F6,

一元多项式的表示及相加

实现思路&#xff1a; 通过链表实现&#xff0c;会更为简单直观。用链表中的每个结点表示多项式中的每一项&#xff0c;多项式每一项都是由数据域&#xff08;包含系数和指数&#xff09;和指针域构成的&#xff0c;所以在定义表示结点的结构体时&#xff0c;可如下所示进行定义…

FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

一 下载源码 FFMPEG https://github.com/FFmpeg/FFmpeg/tree/release/4.3 二 编写脚本 支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的 然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步 然后如果支…

python爬虫入门

基础回顾 使用函数, 先导入, 直接点方法名使用 import math m math.log10(100) print(m)python 交互模式 input输入示例 age int(input("请输入年龄")) age 1 print(age)if else 的使用 和java一样, 只是不加括号, else if 阉割成了 elif 与或非 java : &am…

No3: 学习过程中故障成长积累

文章目录 故障积累1、编码错误导致 故障积累1、编码错误导致

5.2 Bootstrap 过渡效果(Transition)插件

文章目录 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件使用案例 Bootstrap 过渡效果&#xff08;Transition&#xff09;插件 过渡效果&#xff08;Transition&#xff09;插件提供了简单的过渡效果。 注意&#xff1a;如果您想要单独引用该插件的功能&#xff0…