C语言memcpy函数和memmove函数

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

 

memcpy函数和memmove函数都是C语言的库函数,作用都是从一个空间copy一定长度的内容到另一个空间,不同的是memcpy只是单纯的拷贝,当两个空间发生局部重叠时无法保证拷贝的正确(正不正确取决于编译器),而memmove可以保证拷贝正确。

1、memcpy

memcpy函数在使用时包含以下头文件

#include <string.h>
//或
#include <cstring>

memcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,拷贝n个字节到目标dst所指的内存地址的起始位置中。实现如下:

 void* memcpy(void *dst,const void *src,size_t count){void* ret = dst;while (count--){*dst++=*src++;}return (ret);}

2、memmove

memmove函数在使用时需要用到以下头文件(和memcpy一样)

#include <string.h>
//或
#include <cstring>

memmove的原型是memmove(void *dst,void *src,int count),功能和memcpy几乎一样(不考虑空间重叠),其源码是

void *memmove(void *dest, const void *src, size_t count)
{void *ret = dest;if (dest == NULL || src == NULL)return;if (dest <= src || dest >= src + count){while (count--)*dest++ = *src++;}else{dest += count - 1;src += count - 1;while (count--)*dest-- = *src--;}return ret;
}

可以发现memmove函数的源代码比memcpy函数的代码多了一个判断:如果dest在src前面或dest和src是相同的,则拷贝方式和memcpy一样,是从前向后拷贝,但如果dest在src后面,若是还用从前向后拷贝的方法则会出现重叠,所以这时要采用从后向前拷贝的方法。

举个例子:

    char s[] = "12345";memcpy(s + 2, s, 3);printf("%s\n",s);

以上打印的结果应为:12121 (部分编译器为12123)

原理以下图解:

 s指向“1”的地址,s+2指向“3”的地址,以上代码旨在把起点为s地址,长度为3的空间拷贝到s+2处。我们期望得到的是12123,但实际上并非如此。

 

最后结果为:

以上是memcpy函数从前向后拷贝的短板之处,故memcpy函数不能正确拷贝两个空间有重叠的地址。但同样的例子用memmove函数来解决的话就会出现另一个结果,以下是memmove函数从后向前拷贝的过程:

s指针会先移动到“3”的位置,此时s+2指向“5”的地址,然后将s地址上的“3”拷贝到s+2地址处:

 然后指针向前移动进行下一处的拷贝:

最后将“1”覆盖到“3”的地址,最后结果如下:

总结:当需要拷贝的两处地址不存在空间重叠时,memcpy函数和memmove函数的功能是一样的,但存在空间重叠时,memcpy函数不保证正确拷贝(从前往后拷贝),而memmove函数可以正确拷贝(从后往前拷贝)。


http://chatgpt.dhexx.cn/article/JQvs6UaU.shtml

相关文章

memcpy函数用法

各位读者朋友们&#xff0c;由于更新blog不易&#xff0c;如果觉得这篇blog对你有用的话&#xff0c;麻烦关注&#xff0c;点赞&#xff0c;收藏一下哈&#xff0c;十分感谢。 1、简介 memcpy 函数用于把资源内存&#xff08;src所指向的内存区域&#xff09; 拷贝到目标内存…

【C库函数】memcpy函数详解

目录 memcpy 函数原型 参数讲解 返回值讲解 函数讲解&#xff08;三个注意点&#xff09; memcpy 拷贝内存块到目标空间 函数原型 void *memcpy( void *dest, const void *src, size_t count ); 参数讲解 参数destsrccount解析目标空间地址要拷贝内容空间源地址拷贝内容…

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

文章目录 &#x1f4d8;前言&#x1f4d7; 一、memcpy&#xff08;内存拷贝&#xff09;&#x1f4d6; 1. 函数说明&#x1f4d6; 2. 模拟实现&#x1f4a1; 3. 运行图示: &#x1f4d7;二、memmove&#x1f4d6; 1. 函数说明&#x1f4d6; 2. 模拟实现&#x1f4a1; 3. 运行图…

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…