C语言——内存操作函数(memcpy、memmove、memcmp、memset)

article/2025/9/16 17:37:45

文章目录

  • 📘前言
  • 📗 一、memcpy(内存拷贝)
    • 📖 1. 函数说明
    • 📖 2. 模拟实现
    • 💡 3. 运行图示:
  • 📗二、memmove
    • 📖 1. 函数说明
    • 📖 2. 模拟实现
    • 💡 3. 运行图示:
  • 📗三、memcmp
    • 📖 1. 函数说明
    • 📖 2. 函数的功能(主要作用)
  • 📗三、memset
    • 📖 1. 函数说明
    • 📖 2. 函数的功能(主要作用)
  • 📝 总结


📘前言

本文章会详解C语言进阶内容,有关内存操作函数(memcpy,memmove,memcmp,memset)的使用说明、API文档该类函数原型以及模拟实现内存函数


📗 一、memcpy(内存拷贝)

📖 1. 函数说明

首先我们从API文档中搜索memcpy查看一下该函数的原型
函数原型

可以看出该函数有三个参数,那么这三个参数的作用分别是什么呢?

该函数的实现思路是将把源头数据const void * source拷贝到目标数据void * destination里去,最后一个参数size_t num则代表需要拷贝多少个字节,这个函数在遇到'\0'的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。

那么它与字符串函数strcpy有什么区别呢?

我们可以看出memcpy的函数参数的返回类型是void*,所以memcpy不考虑你拷贝的数据是何种类型,都可以将原指针指向的空间传入num个字节数拷贝到dest指针处;而strcpy的参数是已经被写死了,传入的类型必须是char类型数据,实现较为单一。

简单的实现一下该函数
在这里插入图片描述
我们定义了两个int类型的数组,接着使用memcpy,如果想拷贝五个元素到arr2数组中去,因为int类型数组一个元素大小占4个字节,要拷贝五个元素,则第三个参数给的是20个字节。


📖 2. 模拟实现

因为是模拟实现,所以我们需要设计的函数返回类型,参数个数,参数类型都要与其一致。
在这里插入图片描述

由于数组元素要考虑字节数,所以就涉及到大小端的问题,这里我们以小端为例:1 在内存中十六进制是 0x 00 00 00 01,小端存储是低位放在低地址,高位放在高地址。
在这里插入图片描述

如果我们需要向上面图解所示,将arr1数组的元素按照每一个字节拿到arr2数组中,一共拿20个字节,我们怎么才能做到一个一个字节拿出来呢?

首先我们需要对指针解引用操作,把*src的内容放到*dest中去,因为一次要拷贝一个字节,我们可以直接强制类型转化成char*类型就可以访问一个字节了。接着继续往后访问,还需要强制类型转化成char*类型再+1让指针往后走;该操作需要执行的次数取决于参数num的取值所以这里用while循环,随着每一次的操作,num–,直到num为0循环结束。最后该函数设计的时候返回的是一个void*指针,所以我们可以在循环操作前,先定义一个void* res用来存放最初始的dest程序结束,return res;就可以了。


💡 3. 运行图示:

在这里插入图片描述


📗二、memmove

📖 1. 函数说明

由上述memcpy函数想到一个问题,我们在拷贝的时候能不能从同一个数组里,将arr1数组前五个元素拷贝到,从3开始3,4,5,6,7这个位置上,理想结果arr1数组应该是{1,2,1,2,3,4,5,8,9,10}这样的结果可事实真是如此吗?接着我们调试,从监视里观察arr数组的元素
在这里插入图片描述

从图中可以看出arr1数组运行完的结果与预期的有所差异,下标为2到下标为6的元素变成了1,2,1,2,1了!
在这里插入图片描述
由图所示从同一个数组中不同位置进行拷贝操作的时候,原空间和目标空间有重叠的时候,拷贝过程中已经将目标空间的数据已经覆盖掉了,后续再进行拷贝操作的时候,拷贝的数据已经不是原空间的数据了。
在这里插入图片描述
如果是如上情况(src在dest的右边并有重叠部分)就得从4开始拷贝,从前向后拷贝。反之如果src在dest的左边,则需要从后向前拷贝,如果没有重叠部分,从前向后or从后向前都是可行的,因为没有数据不会在拷贝前被覆盖了

所以我们不能使用memcpy函数进行在同一个数组里进行内存拷贝!这时候就要用到另一个内存函数memmove


📖 2. 模拟实现

此时我们只需思考从后往前拷贝时,应该如何实现
在这里插入图片描述
从图中可知,src是<dest的,所以需要从后往前拷贝,要先找到8这个数,就是src最末位字节,这里是第20个字节,则需要找个下标为19的那个字节,所以用起始位置加上num偏移量-1,则找到了元素为8的字节空间,紧接着解引用赋值给dest末尾的字节空间
在这里插入图片描述

从调试窗口中可以看出,结果与开始的预测相同
在这里插入图片描述
模拟完成

💡 3. 运行图示:

在这里插入图片描述


📗三、memcmp

📖 1. 函数说明

函数原型
在这里插入图片描述
memcmp是比较内存区域ptr1和ptr2的前num个字节,比较的是内存大小,*注如果两个字符串相同且num值大于字符串长度的话,不会在\0出停下程序,会继续往后进行比较,直到达到num次数

📖 2. 函数的功能(主要作用)

memcmpstrcmp函数功能相似,只不过是可以对所有类型都进行一个字节一个字节的比较,逐字节比较内存的大小。
返回值有三种情况

‘< 0’ :"参数ptr1"与"参数ptr2"逐字节比较,"参数ptr1"数据 < “参数ptr2”;(VS编译器下返回值为 -1
‘= 0’: "参数ptr1"与"参数ptr2"内存大小相等;(VS编译器下返回值为 0
‘> 0’:"参数ptr1"与"参数ptr2"逐字节比较,"参数ptr1"数据 > “参数ptr2”。(VS编译器下返回值为 1

举 ‘>0’ 一例说明:
在这里插入图片描述


📗三、memset

📖 1. 函数说明

函数原型
在这里插入图片描述
以字节为单位来设置值
参数分别为:
1 . 一个指向需要被修改的内存空间的地址
2 . 指定修改的内容(int类型)
3 . 需要修改的字节数

📖 2. 函数的功能(主要作用)

memset函数的作用:在指向的内存空间的前num个字节内容修改成所指定的int value的内容,有些类似于memcpy的工作原理。
图示说明
在这里插入图片描述


📝 总结

以上就是有关C语言进阶的内容,内存操作函数部分的模拟实现和函数使用说明及方法。
希望该篇文章对大家的学习有所帮助,期待与大家共同进步,持续更新中…
点个关注点个赞👍吧!
💗🤍💕💖


http://chatgpt.dhexx.cn/article/7HpEisFE.shtml

相关文章

memcpy函数详解 看这一篇就够了-C语言(函数讲解、 使用用法举例、作用)

memcpy()函数用于&#xff1a;复制内存块 函数介绍 函数声明&#xff1a;void * memcpy ( void * destination, const void * source, size_t num ); 参数 目的地&#xff1a;指向要在其中复制内容的目标数组的指针&#xff0c;类型转换为 void* 类型的指针。 源&#xff1a;指…

智慧校园信息化管理平台技术方案

1.2总体架构设计 智慧校园平台是以学校现有网络为基础&#xff0c;以服务于全校师生的教学、科研、生活为目的&#xff0c;建立在学校数据中心平台之上&#xff0c;涵盖了学校的学校管理、学生管理、教学管理、班级管理、家校共育、教务管理等全方位的管理信息平台与信息服务平…

县域教育信息化优质均衡建设解决方案

项目概述 “人才决定未来&#xff0c;教育成就梦想”。我国一直坚持不懈推进教育信息化&#xff0c;努力以信息化为手段扩大优质教育资源覆盖面。我国规划将通过教育信息化&#xff0c;逐步缩小区域、城乡数字差距&#xff0c;大力促进教育公平&#xff0c;让亿万孩子同在蓝天…

XXX高校数字化校园数据中心建设方案

目录 一、 项目概述 4 1.1建设背景 4 1.2建设目标 5 1.3建设原则 6 1.4云平台技术打造大数据与高性能优势 7 二、 需求分析 9 2.1现状分析 9 2.2总体建设 9 2.2.1XXX高校校园云平台需求 10 2.2.2大数据分析需求 10 2.2.3高性能需求 12 三、 数据中心总体规划 14 四…

智慧教育信息化建设解决方案

建设思路及解决方案 以数据整合、应用融合、服务聚合为目标&#xff0c;充分利用已有的成果&#xff0c;联接全校物联感知设备、构筑智能化安防体系&#xff0c;打造泛在化的学习环境、实现一体化的运维管控&#xff0c;最终形成智慧环境、智慧管理、智慧服务、智慧教学、智慧资…

信息化建设规划_职业院校教育信息化建设发展规划编制培训班圆满落幕!

9月24日至25日&#xff0c;由中国高等教育培训中心主办的职业院校教育信息化建设发展规划编制培训班&#xff0c;在重庆滨乐宝轩酒店盛大举行。会上&#xff0c;来自全国的教育专家、学者齐聚一堂&#xff0c;共同探讨智慧校园建设实现路径&#xff0c;面向与会的百余名教育工作…

如何建设教育信息化评价指标体系?

原创 CERNET 中国教育网络 2020-09-16 在教育信息化生态系统中&#xff0c;有三大推动力量&#xff1a;教育信息化评价指标体系制定、评估工作开展和评估建模分析&#xff0c;这三者相互依赖、相互影响。 01高校信息化建设的现状与问题 自从教育部发布《教育信息化2.0行动计…

某企业运营(集团)有限公司信息化建设规划方案

目录 1. 单位信息化建设现状分析 1.1 网络性能风险 1.2 管理功能风险 1.3 网络安全风险 1.4 数据安全风险 1.5 访问身份识别风险 1.6 信息化支撑环境风险 2. 需求分析 2.1 网络及管理需求分析 2.2 网络安全需求分析 2.3 …

教育信息化2.0建设解决方案

教育强则国家强&#xff0c;教育兴则民族兴。教育不仅关乎个体发展&#xff0c;家庭幸福&#xff0c;而且关乎国家强盛&#xff0c;民族复兴。教育是提高人民综合素质、促进人的全面发展的重要途径&#xff0c;是民族振兴、社会进步的重要基石&#xff0c;是对中华民族伟大复兴…

计算机在校学校目标和措施,学校信息化工作方案

学校信息化工作方案 指导思想&#xff1a; 以学校总体办学思路为指针&#xff0c;贯彻教育局信息中心&#xff0c;从务实、求真出发继续深入开展现代教育技术的普及工作&#xff0c;在积累经验的基础上&#xff0c;努力将信息教学普及化、提升管理使其规范化&#xff0c;加强管…

计算机在校学校目标和措施,学校信息化建设三年发展规划

学校信息化建设三年发展规划 为了加快学校信息化发展&#xff0c;明确学校信息化发展目标、方向和重点&#xff0c;以“科学发展观”为指导思想&#xff0c;依据中小学信息化发展建设的要求&#xff0c;针对我校信息化建设的现状&#xff0c;特制定三年信息化建设发展规划&…

二维正态分布的最大似然估计_最大似然估计-高斯分布

前言&#xff1a;介绍了最简单的 问题 (这里都是玩具数据&#xff0c;为了方便理解才列出) 0123456789101112 X 1 2 3 4 4.2 4.4 4.6 4.8 5 6 7 8 y 0 0 0 0 1 1 1 1 0 0 0 0 假设 x 4.9 用科学的办法估计 y 的分类。 预备知识 高斯分布的概率密度函数 高斯分布的概率密度函数…

极大似然估计详解

极大似然估计 以前多次接触过极大似然估计,但一直都不太明白到底什么原理,最近在看贝叶斯分类,对极大似然估计有了新的认识,总结如下: 贝叶斯决策 首先来看贝叶斯分类,我们都知道经典的贝叶斯公式: 其中:p(w):为先验概率,表示每种类别分布的概率;:类条件概…

【概率论】极大似然估计和最大后验估计

目录 1.前言 2 频率学派和贝叶斯学派 2.1 频率学派 2.2 贝叶斯学派 3. 极大似然估计 3.1 概率和似然 3.2 极大似然原理及求解 3.3 例题 4. 最大后验估计 4.1 最大后验估计原理 5. 参考 1.前言 极大似然估计和最大后验估计都是参数的估计方法&#xff0c;一定要记住&a…

极大似然估计(Maximum Likelihood Estimation)

1.极大似然估计 笔记来源&#xff1a;Maximum Likelihood&#xff0c;clearly explained!! 在日常对话中&#xff0c;我们说的“概率”和“似然”其实是一回事&#xff0c;但在统计领域中&#xff0c;“似然”指的是我们下面要描述的情况&#xff0c;即尝试为所给测量值的分布…

【转载】极大似然估计

原文链接&#xff1a;知行流浪 https://blog.csdn.net/zengxiantao1994/article/details/72787849 以前多次接触过极大似然估计&#xff0c;但一直都不太明白到底什么原理&#xff0c;最近在看贝叶斯分类&#xff0c;对极大似然估计有了新的认识&#xff0c;总结如下&#xff1…

p 型极大似然估计 matlab,最大似然估计的matlab实现

最大似然估计的matlab实现 最大似然估计的matlab实现 实验目的&#xff1a; 在MVU估计量不存在或存在但不能求解的情况下&#xff0c;最大似然估计是获得实用估计的最通用的方法&#xff0c;利用它可简便地实现对复杂的估计问题的求解。对绝大多数实用的最大似然估计&#xff…

正态分布的极大似然估计

1. 正态分布的极大似然估计 笔记来源&#xff1a;Maximum Likelihood For the Normal Distribution, step-by-step!!! 1.1 正态分布的参数对其形状的影响 1.1.1 μ值对正态分布的影响 1.1.2 σ值对正态分布的影响 1.2 极大似然估计 极大似然估计提供了一种给定观察数据来评…

极大似然估计和最大似然估计定义

最近看朴素贝叶斯法&#xff0c;发现有关于极大似然估计部分&#xff0c;网上找了好久&#xff0c;感觉也都说不清。然后还有个最大似然估计&#xff0c;最要命的是我发现还有人专门对两者区别做了论述。然后我就看了下英文定义&#xff1a; 最大似然估计(maximum likelihood …