来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

今天又来写一篇C的文章,这里要讲的是C语言中的几个内存函数,主要是讲解功能和用法,望能耐心观看哦。望官方也多多曝光。

目录

memcpy

 memmove

memset

 memcmp



memcpy

 memcpy  是 C 语言标准库中的一个函数,用于复制内存块的内容。它的主要作用是将一个源内存区域的内容复制到另一个目标内存区域,且是按照所给字节数进行复制。
 
函数原型:
 
 

void *memcpy(void *dest, const void *src, size_t n);



 
参数说明:
 
 dest :指向目标内存区域的指针,复制的结果将存储在这个位置。
  src :指向源内存区域的指针,要复制的内容将从这个位置读取。
  n :要复制的字节数。

 
函数行为:
 
1.  memcpy  会从源内存区域复制指定数量的字节到目标内存区域。
2. 复制是按字节进行的,不考虑数据类型或字节序。
3. 函数返回指向目标内存区域的指针。

 
代码使用例子:

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

 

代码解析:上面代码中我们调用函数memcpy函数,进行传参,将arr1前20个字节的内容,复制到arr2中。根据结果确实如此,20个字节为5个整形元素大小,所以这里从arr1中1,2,3,4,5 复制到arr2中,至于后面的5个0,是因为在VS中如果未对数组中进行初始化的元素,会默认为0.


为了让大家更了解这个函数,这里为大家模拟实现一下memcpy函数:

void* Memcpy(void* dst, const void* src, size_t count)
{void* ret = dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}return(ret);
}

这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。 

 需要注意的是:memcpy是不能对两个有重叠部分的指针完成准确的复制的,所以我们需要看下一个有重叠部分也可以完成操作的函数memmove。


 memmove

 memmove  是 C 语言标准库中的一个函数,它与  memcpy  类似,用于复制内存块的内容。与  memcpy  不同的是, memmove  可以在源和目标内存区域有重叠的情况下安全地进行复制。
 

函数原型:
 

 

void *memmove(void *dest, const void *src, size_t n);


 
 参数说明:
 

 dest :指向目标内存区域的指针,复制的结果将存储在这个位置。
  src :指向源内存区域的指针,要复制的内容将从这个位置读取。
  n :要复制的字节数。

 
函数行为:
 
1.  memmove  用于在不同的内存位置之间复制数据,即使源和目标区域有重叠也能正确工作。
2. 它会根据源和目标的相对位置,以适当的方式复制数据,确保结果是正确的。


 
代码简单使用例子:

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

 

代码解析:这里很明显即使我们调用memmove函数时传过去的指针地址是明显有重叠部分的,但是这里我们看见结果确实是没问题的,将arr的前20个字节即5个元素复制到arr+2往后的元素。 


还是为了大家更好理解函数的逻辑,给大家模拟实现一下memmove函数 :

void* memmove(void* dst, const void* src, size_t count)
{void* ret = dst;if (dst <= src || (char*)dst >= ((char*)src + count)) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/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);
}

 这里面强制转化为char*的指针是因为让指针dst和src都是一个一个字节的往后访问。 


memset

 memset  是 C 语言标准库中的一个函数,用于将指定的内存区域填充为特定的值。
 

函数原型:
 
 

void *memset(void *str, int c, size_t n);


 
 
参数说明:
 
 str :指向要填充的内存区域的指针。
 c :要填充的特定值。通常是一个整数类型的值。
 n :要填充的字节数。

 
函数行为:
 
1.  memset  使用指定的值  c  填充内存区域的前  n  个字节。
2. 填充是按字节进行的,无论内存区域的实际数据类型如何。


 
简单代码使用例子:

#include <stdio.h>
#include <string.h>
int main()
{char str[] = "hello world";memset(str, 'x', 6);printf(str);return 0;
}

 

函数较为简单就不多加解释了。 


 memcmp

memcmp是一个用于比较内存区域的函数

 函数原型:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

 

参数说明:两个需要比较的内存块的起始地址 ptr1 和 ptr2,以及需要比较的字节数 num。

函数行为:

函数会比较 ptr1 和 ptr2 指向的内存块前 num 个字节的内容,返回值为整型,表示比较结果:如果两个内存块的前 num 个字节完全相等,则返回0;如果 ptr1 指向的内存块小于 ptr2 指向的内存块,则返回负数;如果 ptr1 指向的内存块大于 ptr2 指向的内存块,则返回正数。
 

代码简单实用例子:

#include <stdio.h>
#include <string.h>
int main()
{char buffer1[] = "hello";char buffer2[] = "good";int n;n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0)printf("'%s' 比 '%s'大.\n", buffer1, buffer2);else if (n < 0)printf("'%s' 比 '%s'小.\n", buffer1, buffer2);elseprintf("'%s' 与 '%s'一样大.\n", buffer1, buffer2);return 0;
}

 


今天文章就结束了,觉得有用,可以点个赞再走唔。 

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

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

相关文章

rtt设备io框架面向对象学习-dac设备

目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da…

基于Transformer的机器学习模型的主动学习

主动学习和基于Transformer的机器学习模型的结合为有效地训练深度学习模型提供了强有力的工具。通过利用主动学习&#xff0c;数据科学家能够减少训练模型所需的标记数据的数量&#xff0c;同时仍然达到高精度。本文将探讨基于Transformer的机器学习模型如何在主动学习环境中使…

MySQL数据库⑩_视图+MySQL用户管理(增删查改)

目录 1. 视图的概念和规则限制 2. 视图的基本使用 2.1 创建视图 2.2 修改视图影响基表 2.3 修改基表影响视图 2.4 删除视图 3. MySQL用户管理 3.1 用户信息 3.2 创建用户 3.3 修改用户密码 3.4 删除用户 4. 用户权限 4.1 MySQL权限 4.2 给用户授权 4.3 回收权限…

MongoDB聚合: $redact

$redact阶段可以根据文档本身存储的信息&#xff0c;限制输出整个文档或文档中的内容。 语法 { $redact: <expression> }使用 参数可以是任何有效的表达式&#xff0c;只要能被解析为$$DESCEND、$$PRUNE或 $$KEEP系统变量即可。 $$DESCEND $redact返回当前文档级别的…

Windows Server 2019 DHCP服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 1)实验服务器配置和客户端 2)实验环境 2.服务器配置 ​编辑 文章目录 Windows Server 2003 Web服务器搭建Windows Server 2003 FTP服务器搭建Windows S…

深度优先搜索、广度优先搜索

搜索 搜索就是采用直接遍历整个状态空间的方式寻找答案的一类算法。根据遍历状态空间&#xff08;图&#xff09;方式的不同&#xff0c;可分为&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 适合树形状态空间&#xff0c;因为递归本身就会产生树的结构&#xff0c;可…

Leetcode 236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

在微信视频号上发表视频

我们手机打开微信 然后 最下面选择 发现 然后点击 上面的视频号 进入后 点击 右上角头像图标 然后 进入个人管理界面 左下角选择 发表视频 然后 进入一个录制界面 我们左下角 点击这个 从相册选择 打开相册后 选择自己需要的视频 然后 点击右下角下一步 觉得内容没问题 就…

Lua编译与运行

lua会首先把代码编译成中间码然后执行&#xff0c;或许大家都有所困惑&#xff1a;它不是解释性语言吗&#xff1f;其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作&#xff0c;正是dofile、loadfile、require这种函数的存在&#xff0c;lua才能顺理成章地称自己…

VUE基础知识(JAVA后端入门篇)

VUE基础知识&#xff08;JAVA后端入门篇&#xff09; Vue是一套前端框架&#xff0c;免除原生JavaScriptr中的DOM操作&#xff0c;简化书写基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上Vue.js - 渐进式 JavaScrip…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

51单片机编程基础(C语言):电子时钟(LED1602作为显示)

题目要求&#xff1a; 审题时这个题是用数码管来显示的&#xff0c;数码管显示时钟我完成了一个&#xff0c;只是要求跟他不一样&#xff0c;所以这次想用LCD1602来显示&#xff0c;所以我先用LCD1602完成&#xff0c;再用数码管完成&#xff08;其实也只要在我之前的项目基础…

如何学习机器学习和深度学习: 软件工程师指南

一、简介 人工智能这个主题激发了我的兴趣&#xff0c;我一直在这个领域中不断学习和尝试新事物。 众所周知&#xff0c;与自然语言处理、计算机视觉等相关的技术已经出现并发展成为每天被数百万用户使用的解决方案。 尽管人们使用“人工智能”这一术语&#xff0c;但我们离…

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

C++ //练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

C Primer&#xff08;第5版&#xff09; 练习 6.7 练习 6.7 编写一个函数&#xff0c;当它第一次被调用时返回0&#xff0c;以后每次被调用返回值加1。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…

如何将字体添加到 ONLYOFFICE 文档服务器 8.0

作者&#xff1a;VincentYoung 阅读本文&#xff0c;了解如何为自己的在线办公软件 ONLYOFFICE 文档服务器的字体库添加字体 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书…

无人机竞赛视觉算法开发流程开源计划(询问大家意见)

本科中参加过一系列的无人机机器人竞赛&#xff0c;像电赛、工训赛、机器人大赛这些&#xff0c;有一些比较常用的方案打算开源一下。现在读研了&#xff0c;也算是对本科的一个总结&#xff0c;但是还是想看看大家意见&#xff0c;大家有什么需求可以在评论区说&#xff0c;我…

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

QTabWidget和QTabBar控件样式设置(qss)

QTabWidget和QTabBar控件样式设置 1、QTabWidget样式可自定义的有哪些示例&#xff1a;效果图 2、QTabBar样式可自定义的有哪些示例效果图 1、QTabWidget样式可自定义的有哪些 QTabWidget::pane{} 定义tabWidgetFrameQTabWidget::tab-bar{} 定义TabBar的位置QTabWidget::tab{}定…