关于memcpy和memmove的一点说明
今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是
实现同样的功能,没有接触到其不同。
memcpy和memmove在MSDN的定义如下:


从两者的声明来看的确没有区别,我们来看这样一个例子
当我们需要将char* src="abcde"这个字符串全部copy到dest中然而src与dest在内存中大概是这样存在的:
内存地址 低------>高
src dest [ a ][ b ][ c ][ d ][ e ][ '\0' ][ ][ ][ ][ ][ ][ ][ ]
src地址为内存1,目的地址为内存2此时很明显内存出现了重叠,当我们拷贝字符a到第三个内存位置的时
a将覆盖src内存中的第三个字符 这种情况在memcpy未定义然而memmove却给出了正确的处理方式
解决方法,试想当我们先将dest地址移动dest+n-1同时src地址移动src+n-1这样再从src的最后一个元素开
始逐个向前拷贝到dest中就完美的避免了内存重叠导致的元素覆盖问题呢
下面我们根据memcpy和memmove给出自己的实现:
#include <iostream>
using namespace std; void *memcopy( void *dest, const void *src, size_t count )
{
if(dest==NULL||src==NULL)
return NULL;
char* Dest=(char*)dest;
const char* Src=(char*)src; int i=; while(i<count)
{
*Dest++=*Src++;
i++;
} return dest;
} void *memmove(void *dest,const void *src,size_t count )
{
if(dest==NULL||src==NULL)
return NULL; char* Dest=(char*)dest;
const char* Src=(char*)src; int i=;
if(src>dest)
{
while(i<count)//正向拷贝
{
*Dest++=*Src++;
i++;
}
}
else
{
Dest=Dest+count-;//反向拷贝
Src=Src+count-; while(i<count)
{
*Dest--=*Src--;
i--;
}
} return dest;
} void main()
{
char dest[];
memset(dest,'\0',);
char* src="memcpyteststring";
int n;
cout<<"How many char you want to copy from src to dest(memcpy): ";
cin>>n;
cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;
cout<<"How many char you want to copy from src to dest(memcpy): ";
cin>>n;
cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;
return;
}
运行截图:

关于memcpy和memmove的一点说明的更多相关文章
- memcpy、memmove、memset及strcpy函数实现和理解
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
- memcpy vs memmove
[本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...
- memcpy与memmove的区别
在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...
- C语言实现memcpy和memmove
0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...
- strcpy()、memcpy()、memmove()、memset()的内部实现
一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...
- 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
/*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...
- 模拟实现memcpy 与 memmove
模拟实现memcpy 与 memmove 1.str系列的函数只能处理字符串——>必须带有'\0'2.memcpy内存处理函数:不涉及'\0',需要包含头文件 string.h3.source的 ...
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- C/C++之Memcpy and memmove
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...
随机推荐
- JS--回到顶部代码
原文地址:http://www.cnblogs.com/liguiqiang1986/articles/3132023.html JS--回到顶部代码 <!DOCTYPE html PUBLIC ...
- 10招搞定web设计风格指南
From:http://www.ui.cn/detail/27579.html 今时今日,网站的创建正变得越来越复杂,而且一般都不是一个人就能干的了的.在创建网站过程中,我们需要保证设计前后一致,并符 ...
- IOS UIImage 模糊
#import <UIKit/UIKit.h> #import <Accelerate/Accelerate.h> #import <QuartzCore/QuartzC ...
- 基础总结篇之五:BroadcastReceiver应用详解
問渠那得清如許?為有源頭活水來.南宋.朱熹<觀書有感> 据说程序员是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断地学习新知识,不断地为自己注入新鲜的血液,才能使自己跟上技术的步 ...
- Redis + Jedis + Spring (list操作)
为了简便操作,我使用了StringRedisTemplate.用字符串操作做展示.当然,你可以继续使用RedisTemplate. 闲言少叙,上代码,一目了然: /** * Mar 5, 2013 * ...
- EffectiveC#01--避免返回内部类对象的引用
此篇是对00中第3点的再一次阐述. 1.如果一个属性返回一个引用类型,那么调用者就可以访问这个对象的公共成员,也包括修改这些属性的状态. public class MyBusinessObject { ...
- Chrome开发者工具详解(1):Elements、Console、Sources面板
Chrome开发者工具面板 面板上包含了Elements面板.Console面板.Sources面板.Network面板. Timeline面板.Profiles面板.Application面板.Se ...
- 细讲encodeURI和encodeURIComponent以及escape的区别与应用
首先,我们都知道这三个东西都是用来编码的 先来说encodeURI()和encodeURIComponent() 这两个是在转换url时候用来编码解码用的. 有编码就会有解码, 解码就是decodeU ...
- Android Service(下)
转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...
- NSBundle 类
NSBundle NSBundle继承于NSObject,NSBundle是一个程序包,其中包含了程序会使用的资源(图像,声音,编辑好的代码,nib文件). 一. 初始化NSBundle + (ins ...