C语言:内存函数
创作不易,友友们给个三连吧!!
C语言标准库中有这样一些内存函数,让我们一起学习吧!!
一、memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
1.1 使用的注意事项
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2、这个函数在遇到 '\0' 的时候并不会停下来。
3、如果source和destination有任何的重叠,复制的结果都是未定义的。
4、返回的是目标空间的地址(destination)
5、memcpy函数可以实现整型拷贝、字符拷贝、结构体拷贝等等,所以参数和返回值都是void*
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1, 5 * sizeof(int));//将1、2、3、4、5 拷贝到arr2中for (int i = 0; i < 10; i++)printf("%d ", arr2[i]);return 0;
}
输出结果:1 2 3 4 5 0 0 0 0 0
如果我想将 4 5 6 7 8 拷贝到arr2呢???
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memcpy(arr2, arr1+3, 5 * sizeof(int));//将4 5 6 7 8拷贝到arr2中for (int i = 0; i < 10; i++)printf("%d ", arr2[i]);return 0;
}
输出结果:4 5 6 7 8 0 0 0 0 0
这说明我们可以通过指针的加减来改变我们在数组中的接收地址
1.2 memcpy的模拟实现
void* my_memcpy(void* des, const void* src, size_t num)
{assert(des && src);//确保不传NULL进来void* ret = des;//记住返回值//因为memcpy实现的是任何数据类型的拷贝,且num是字节,所以强转成char*进行运算最合适while (num--){//一次拷贝一个字节*(char*)des = *(char*)src;////迭代 因为强制类型转化的效果是临时的,要一直强转才能运算des = (char*)des + 1;src = (char*)src + 1;}return ret;
}
二、memmove函数的使用和模拟实现
C语言规定:memcpy拷贝的是不重叠的内存,而memmove拷贝的是重叠的内存
void * memmove ( void * destination, const void * source, size_t num );
虽然在vs2022中memcpy也是可以拷贝重叠内存的,但是其他编译器就不一定了,所以我们在使用的时候,尽量是不重叠的用memcpy,重叠的用memmove
2.1 使用的注意事项
1、和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2、如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0 };memmove(arr1+2, arr1, 5 * sizeof(int));//将1、2、3、4、5 拷贝到原来3、4、5、6、7的位置for (int i = 0; i < 10; i++)printf("%d ", arr1[i]);return 0;
}
输出结果:1 2 1 2 3 4 5 8 9 10
2.2 memmove的模拟实现
void* my_memmove(void* dst, const void* src, size_t num)
{assert(dst && src);//确保不传NULL进来void* ret = dst;//记住返回值if (dst < src)//从前往后,和memcpy一样{while (num--){//一次拷贝一个字节*(char*)dst = *(char*)src;////迭代 因为强制类型转化的效果是临时的,要一直强转才能运算dst = (char*)dst + 1;src = (char*)src + 1;}}else//从后往前while (num--)//要跳num-1个字节*((char*)dst + num) = *((char*)src + num);return ret;
}
三、memset函数的使用和模拟实现
void * memset ( void * ptr, int value, size_t num );
3.1 使用的注意事项
memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容。
int main ()
{char str[] = "hello world";memset (str,'x',6);printf(str);return 0;
}
输出结果:xxxxxxworld
注意:该函数是以字节为单位操作的
如果我们操作的是int类型的数组会怎样???
int main()
{int arr[] = {1,2,3,4,5,6,7,8,9,10};memset(arr, 1, 10);for (int i = 0; i < 10; i++)printf("%d ", arr[i]);return 0;
}
输出结果: 16843009 16843009 257 4 5 6 7 8 9 10
为什么会是这样的结果??下面进行分析
3.2 memset的模拟实现
void* my_memset(void* ptr, int value, size_t num)
{while (num--){*(char*)ptr = value;ptr = (char*)ptr + 1;}
}
四、memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
1、⽐较从ptr1和ptr2指针指向的位置开始,向后的num个字节
2、返回值如下:
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8 };int arr2[] = { 1,2,3,8 };printf("%d\n", memcmp(arr1, arr2, 12));
}
输出结果:0
如果我们比较13个字符呢??
int main()
{int arr1[] = { 1,2,3,4,5,6,7,8 };int arr2[] = { 1,2,3,8 };printf("%d\n", memcmp(arr1, arr2, 13));
}
输出结果:-1
因为小端存储,所以arr1的第13个字节存储的是04,而arr2的第13个字节存储的是08,所以返回-1!!
相关文章:

C语言:内存函数
创作不易,友友们给个三连吧!! C语言标准库中有这样一些内存函数,让我们一起学习吧!! 一、memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1 使…...

Go+:一种简单而强大的编程语言
Go是一种简单而强大的编程语言,它是在Go语言之上构建的,旨在提供更加强大、灵活和易于使用的编程体验。Go与Go语言共享大部分语法和语义,因此Go开发人员可以很快上手Go,同时也可以使用Go来编写更加简洁和高效的代码。在本文中&…...

【开源】SpringBoot框架开发数字化社区网格管理系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5.1 查询企事业单位5.2 查询流动人口5.3 查询精准扶贫5.4 查询案件5.5 查询人口 六、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数字化社区网格管理系统…...

Lua可变参数函数
基础规则 lua传入参数给一个function时采用的是“多余部分被忽略,缺少部分有nil补足”的形式: function f(a, b)return a or b endCALL PARAMETERS f(3) a3, bnil f(3, 4) a3, b4 f(3, 4, 5) a3, b4 (5 is discarded) unpack/pack…...

Nginx实战:3-日志按天分割
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、方式1:定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2:logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…...

springmvc中的数据提交方式
一、单个数据提交数据 jsp代码: <h2>1单个数据提交</h2> <form action"${pageContext.request.contextPath}/one.action">name<input name"myname"/><br>age<input name"age"><input type&…...

unity2017 遇到visual studio 2017(社区版) 30日试用期到了
安装unity2017 遇到visual studio 2017 30日试用期到了,网上百度搜了好多方法都没有成功。 最后用了这个方法: 1)启动vs2017,在弹出要登录的窗口之前,迅速的点击工具-》选项-》账户,勾选在添加账户或对账户重新进行身…...

Netty应用(六) 之 异步 Channel
目录 12.Netty异步的相关概念 12.1 异步编程的概念 12.2 方式1:主线程阻塞,等待异步线程完成调用,然后主线程发起请求IO 12.3 方式2:主线程注册异步线程,异步线程去回调发起请求IO 12.4 细节注释 12.5 异步的好处…...

STM32CubeMx+MATLAB Simulink串口输出实验,UART/USART串口测试实验
STM32CubeMxMATLAB Simulink串口输出实验...

【51单片机】串口通信实验(包括波特率如何计算)
目录 串口通信实验通信的基本概念串行通信与并行通信异步通信与同步通信单工、 半双工与全双工通信通信速率 51单片机串口介绍串口介绍串口通信简介串口相关寄存器串口工作方式方式0方式1方式 2 和方式 3 串口的使用方法(计算波特率) 硬件设计软件设计1、…...

Kafka零拷贝技术与传统数据复制次数比较
读Kafka技术书遇到困惑: "对比传统的数据复制和“零拷贝技术”这两种方案。假设有10个消费者,传统复制方式的数据复制次数是41040次,而“零拷贝技术”只需110 11次(一次表示从磁盘复制到页面缓存,另外10次表示10个消费者各自…...

npm ERR! network This is a problem related to network connectivity.
遇到 ETIMEDOUT 错误时,这表明npm尝试连接到npm仓库时超时了,这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤: 1. 检查网络连接 首先ÿ…...

【SQL高频基础题】619.只出现一次的最大数字
题目: MyNumbers 表: ------------------- | Column Name | Type | ------------------- | num | int | ------------------- 该表可能包含重复项(换句话说,在SQL中,该表没有主键)。 这张表的每…...

STM32F1 - GPIO外设
GPIO 1> 硬件框图2> 工作模式 1> 硬件框图 2> 工作模式 C语言描述 /** * brief Configuration Mode enumeration */typedef enum { GPIO_Mode_AIN 0x0, // Analog Input 模拟输入 GPIO_Mode_IN_FLOATING 0x04, // input floating 浮空输入GPIO_Mode_I…...

新增同步管理、操作日志模块,支持公共链接分享,DataEase开源数据可视化分析平台v2.3.0发布
2024年2月5日,DataEase开源数据可视化分析平台正式发布v2.3.0版本。 这一版本的功能升级包括:新增“同步管理”功能模块,用户可通过此模块,将传统数据库中的数据定时同步到Apache Doris中,让数据分析更快速࿱…...

跟着pink老师前端入门教程-day19
一、移动WEB开发之流式布局 1、 移动端基础 1.1 浏览器现状 PC端常见浏览器:360浏览器、谷歌浏览器、火狐浏览器、QQ浏览器、百度浏览器、搜狗浏览器、IE浏览器。 移动端常见浏览器:UC浏览器,QQ浏览器,欧朋浏览器࿰…...

ChatGPT学习第一周
📖 学习目标 掌握ChatGPT基础知识 理解ChatGPT的基本功能和工作原理。认识到ChatGPT在日常生活和业务中的潜在应用。 了解AI和机器学习的基本概念 获取人工智能(AI)和机器学习(ML)的初步了解。理解这些技术是如何支撑…...

爬爬爬——今天是浏览器窗口切换和给所选人打钩(自动化)
学习爬虫路还很长,第一阶段花了好多天了,还在底层,虽然不是我专业要学习的语言,和必备的知识,但是我感觉还挺有意思的。加油,这两天把建模和ai也不学了,唉过年了懒了! 加油坚持就是…...

Netty应用(五) 之 Netty引入 EventLoop
目录 第三章 Netty 1.什么是Netty? 2.为什么需要使用Netty? 3.Netty的发展历程 4.谁在使用Netty? 5.为什么上述这些分布式产品都使用Netty? 6.第一个Netty应用 7.如何理解Netty是NIO的封装 8.logback日志使用的加强 9.Ev…...
【c++基础】国王的魔镜
说明 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把…...

配置DNS正反向解析服务!!!!
一.准备工作 #关闭防火墙和selinux,或者允许服务通过 [rootnode ~]# nmcli c mod ens32 ipv4.method manual ipv4.address 192.168.32.133/24 ipv4.gateway 192.168.32.2 ipv4.dns 192.168.32.132 [rootnode ~]# nmcli c reload [rootnode ~]# nmcli c up ens32[rootnode ~]# …...

大模型2024规模化场景涌现,加速云计算走出第二增长曲线
导读:2024,大模型第一批规模化应用场景已出现。 如果说“百模大战”是2023年国内AI产业的关键词,那么2024年我们将正式迈进“应用为王”的新阶段。 不少业内观点认为,2024年“百模大战”将逐渐收敛甚至洗牌,而大模型在…...

Gitlab和Jenkins集成 实现CI (三)
Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 自动部署 配置免密ssh 进入http服务器 生成ssh密钥 ssh-keygen -t rsa进入jenkins(容器) 拷贝公钥 ssh-copy-id http服务器用户名http服务器ip #输入http服务器密码配…...

随机过程及应用学习笔记(二)随机过程的基本概念
随机过程论就是研究随时间变化的动态系统中随机现象的统计规律的一门数学学科。 目录 前言 一、随机过程的定义及分类 1、定义 2、分类 二、随机过程的分布及其数字特征 1、分布函数 2、数字特征 均值函数和方差函数 协方差函数和相关函数 3、互协方差函数与互相关函…...

【机器学习】Kmeans如何选择k值
确定 K 值是 K-means 聚类分析的一个重要步骤。不同的 K 值可能会产生不同的聚类结果,因此选择合适的 K 值非常重要。 以下是一些常见的方法来选择 K 值: 手肘法:该方法基于绘制聚类内误差平方和(SSE)与 K 值之间的关系图。随着 K 值的增加,SSE会逐渐降低,但降低幅度逐…...

LeetCode 热题 100 | 链表(下)
目录 1 148. 排序链表 2 23. 合并 K 个升序链表 3 146. LRU 缓存 3.1 解题思路 3.2 详细过程 3.3 完整代码 菜鸟做题第三周,语言是 C 1 148. 排序链表 解题思路: 遍历链表,把每个节点的 val 都存入数组中用 sort 函数对数组进…...

Ubuntu搭建计算集群
计算机硬件和技术的发展使得高性能模拟和计算在生活和工作中的作用逐渐显现出来,无论是计算化学,计算物理和当下的人工智能都离不开高性能计算。笔者工作主要围绕计算化学和物理开展,亦受限于自身知识和技术所限,文中只是浅显地尝…...

数据结构~~树(2024/2/8)
目录 树 1、定义: 2、树的基本术语: 3、树的表示 树 1、定义: 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&…...

【教学类-48-03】202402011“闰年”(每4年一次 2月有29日)世纪年必须整除400才是闰年)
2000-2099年之间的闰年有25次, 背景需求: 已经制作了对称年月的数字提取,和年月日相等的年份提取 【教学类-48-01】20240205对称的“年”和“月日”(如2030 0302)-CSDN博客文章浏览阅读84次。【教学类-48-01】202402…...

如何开发一个属于自己的人工智能语言大模型?
要开发一个属于自己的人工智能语言模型,你需要遵循以下步骤: 数据收集:首先你需要大量的文本数据来训练你的模型。这些数据可以来自于各种来源,例如书籍、网站、新闻文章等。你需要确保这些数据足够多样化,以便模型能学…...