C语言内存函数(memcpy、memmove、memcmp)详解

2023-11-15

一、memcpy(string.h)

1.介绍

memcpy函数为内存拷贝函数,既可以拷贝字符串,也可以拷贝整形数组、浮点型数组等,具有明显的应用优势,

destination为目的地空间,source为不可修改(const)的来源空间,num表示无符号的字节数。其主要含义为将source内容拷贝到destination中,拷贝num个字节数。其返回类型、目的地、来源类型均为void* ,void*可以接收任意类型的参数。因为它可以拷贝多种不同类型的内容,运用单一的类型,就限制了其拷贝的内容了。size_t表示无符号数。

返回时会返回目的地的起始位置地址。

下面我们通过几个例子了解一下它的用途。

2.例子

2.1 例一

 通过例一我们发现,memcpy函数将arr1的前5个字节数拷贝进了arr2数组中因为char类型的变量所占的字节数为1,所以abcde都拷进了arr2中。返回值为arr2数组的起始位置的地址。

2.2 例二

例一和例二的不同点在于多拷贝了一个字节,将arr1中的字符'\0'拷进了arr2中,因此在打印arr2数组时遇见了拷贝进去的字符'\0',因此它只会打印'\0'之前的内容,所以打印出的结果为abcde。

这也就说明了内存拷贝函数memcpy不会去管拷贝内容究竟是什么,只要没到达我拷贝的字节数,那就嘎嘎拷贝就完了。

2.3 例三

例三不为字符的拷贝了,为整形数组的拷贝,与浮点数拷贝两者相同。 也是将arr1中的前20个字节数,也就是5个整形变量,拷贝进了arr2中,其主要关键的点在于20表示的意思为前20个字节数。当然,如果你拷贝前19个字节,就会出现一些问题,所以拷贝时尽量按照一个变量所占字节数的整数倍来进行拷贝。

2.4 例四

我们预期结果为1 2 1 2 3 4 5 8 9 10 但实际结果为1 2 1 2 1 2 1 8 9 10。因此达不到我们预期结果。

这是因为我们想将12345拷贝进34567之中,所以1拷贝代替了3,2拷贝代替了4,此时3和4被变成了1和2,那么再拷贝3和4进5和6时,就是1和2拷贝进5和6了,剩下的拷贝也是如此。

应注意,此时目的地空间和来源空间有重叠空间,因此memcpy函数不支持有重叠内存空间的拷贝的,此时我们就需要另一个函数memove来帮助我们处理有重叠空间的内存拷贝。

二、memove(string.h)

1.介绍

memove函数为内存移动函数,也就是将来源空间内容移动到目的地空间之中。相当于拷贝。

 其参数类型和返回值和memcpy完全相同,其含义为将source(来源)前num个字节数空间的内容移动到destination(目的地)空间之中,和拷贝含义几乎相同。这就过多介绍了。其用法也基本相同,只不过,memmove函数可以处理重叠内存空间的拷贝。

直接看实例

2.例子

只看一个例子即可,就是重叠内存空间的处理,其他处理和memcpy函数相同。

 

 可以看到,memmove函数可以处理重叠内存空间的拷贝(移动)。因此在使用memcpy和memmove两个函数时要注意其应用条件。

三、memcmp(string.h)

1.介绍

memcmp函数为内存比较函数,其与字符串比较函数strcmp函数相像,不同的是memcmp函数可以既可以比较整形、浮点型,也可以比较字符串。

因为是比较函数,所以原来的空间内容是不可被修改的,只能用于比较,因此前两个参数都用了const做修饰。其可以接收任意类型的参数。其基本含义为比较两个空间前num个字节数内容大小,返回值类型为整形,若ptr1 > ptr2,则返回大于0的数字,若等于,则返回0,若小于,则返回小于0的数字。

2.例子

 

 比较arr1和arr2前9个字节空间的内容,而arr1和arr2前九个字节相同,因此返回0。

而比较前10个字节的时候,arr2的第10个字节内容大于arr1第10个字节的内容的,因此返回-1,表示arr1小于arr2。

综上,三大内存函数就已完全结束。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言内存函数(memcpy、memmove、memcmp)详解 的相关文章

随机推荐

  • 正则表达式中.*的作用

    今天看正则表达式的书籍是看到这么个例子 要求匹配 文章中的xml 匹配使用的正则表达式为 lt xml gt 一开始没有理解 是做什么用处的 百度了一番后明白了 原来 中 代表任意单个字符 包括空格 代表前面任意单个字符的重复次数 因此 l
  • mysql 获取当前时间戳

    ysql 获取当前时间为select now 运行结果2012 09 05 17 24 15 mysql 获取当前时间戳为select unix timestamp now 运行结果 unix timestamp now 134683698
  • ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    关于这个问题是在 基于MySQL Yum存储库在Linux 7 2上安装MySQL 5 7 21数据库服务 实战篇 时遇到的问题 这是 mysql 初始化时 使用临时密码 修改自定义密码时 由于自定义密码比较简单 就出现了不符合密码策略的问
  • maven工程下 读取resource下配置文件

    在maven工程中 我们会将配置文件放到 src main resources 下面 例如 我们需要确认resource 下的文件 编译之后存放的位置 它编译的路径直接位于classes下面 这个路径其实就是classPath的路径 所以
  • 【C语言基础】学生成绩管理系统(方法:数组)

    涉及 字符型数组 代码 include
  • 两款免费、好用的数据库连接工具

    一 Navicate Navicat是一套快速 可靠的数据库管理工具 专为简化数据库的管理及降低系统管理成本而设 它的设计符合数据库管理员 开发人员及中小企业的需要 Navicat 是以直觉化的图形用户界面而建的 让你可以以安全并且简单的方
  • 《5分钟说完一个概念》:什么是Bootstrap采用

    想知道中国人的平均身高 群体均值 群体方差为 每次抽样 1000 人 抽样了 次 每次抽样的 1000人 的平均身高是一次随机抽样 这
  • 网络带宽和吞吐量

    转载网络带宽和吞吐量
  • crmeb 多商户小程序配置

    一 小程序下载并提交审核 下载微信小程序代码 位置 平台后台 gt 应用 gt 小程序 1 首先需要填写这里的小程序信息 然后在这里就可以下载 如果未开启直播要选择 否则会无法使用 2 下载编译后的小程序代码 没有配置小程序的需要先配置小程
  • 计算机视觉实验:直方图均衡化、Hough变化应用

    实验结果
  • npm指令执行前执行自定义代码

    1 基本逻辑 npm start执行前执行node bin wb handle scripts wb node bin wb handle npm start wb handle源码 删除deleteNodeModules配置的最后一级目录
  • OA项目之项目整体业务分析【附项目原型图演示】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 Welcome Huihui s Code World 一 项目简介 1 目的 2 人员名词解释 3 主界面展示 二 会议管理 1
  • UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position

    爬虫爬取网页 将其写入文档 出错 错误如下 coding utf 8 和数据流IO操作时的编码转化都已经在程序中加入了 gbk哪里来的呢 其实就是win中新文件的默认编码是gbk 当我们遇到编码问题的时候 有三个地方需要注意的 文件的编码
  • 计算机网络:计算机网络拓扑结构的五种分类方式

    计算机网络拓扑分类 计算机网络的拓扑结构指网络节点和链路之间的分布和互连形成的物理形状 分类一 星形拓扑结构 一种以中央节点为中心 把若干外围节点连接起来的辐射状互联结构 优点 易扩充 控制简单 中央节点实施对全网的控制 缺点 中央节点会成
  • 数据拟合

    数据拟合 MATLAB实现RBF径向基神经网络多输入数据拟合 目录 数据拟合 MATLAB实现RBF径向基神经网络多输入数据拟合 基本介绍 程序设计 模型差异 参考资料 基本介绍 RBF神将网络是一种三层神经网络 其包括输入层 隐层 输出层
  • 维基百科 MediaWiki API 解析

    使用开放的 API 做一个自己的小项目 是一个很好的学习方法 但好像开放的 API 选择并不多 这里给大家多一个选择 简单介绍一下维基百科使用的 MediaWiki API 简介 先简单介绍几个容易混淆的概念 Wiki Wiki 是一种在网
  • 虚拟机 安装Centos 7 详细教程

    1 下载镜像文件centos 7 2 新建centos7目录 将下载的镜像放到这里 方便以后管理 3 打开vm应用软件 点击新建虚拟机 4 选择install centos7进行安装 回车继续 5 选择语言 根据自己爱好 6 在这我们可以选
  • 使用Python批量拼接图片

    前言 当需要将多张图像拼接成一张更大的图像时 通常会用到图片拼接技术 这种技术在许多领域中都有广泛的应用 例如计算机视觉 图像处理 卫星图像 地理信息系统等等 在实际应用中 拼接图像可以用于创建全景图像 地图 海报 广告牌等等 本文将使用以
  • Python中if __name__ == '__main__'的使用方法

    转 如何简单地理解Python中的if name main 2017年09月09日 22 35 42 Locutus 阅读数 219985 1 摘要 通俗的理解 name main 假如你叫小明 py 在朋友眼中 你是小明 name 小明
  • C语言内存函数(memcpy、memmove、memcmp)详解

    一 memcpy string h 1 介绍 memcpy函数为内存拷贝函数 既可以拷贝字符串 也可以拷贝整形数组 浮点型数组等 具有明显的应用优势 destination为目的地空间 source为不可修改 const 的来源空间 num