今天看到书上降到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的一点说明的更多相关文章

  1. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  2. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  3. memcpy与memmove的区别

    在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...

  4. C语言实现memcpy和memmove

    0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...

  5. strcpy()、memcpy()、memmove()、memset()的内部实现

    一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...

  6. 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())

    /*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...

  7. 模拟实现memcpy 与 memmove

    模拟实现memcpy 与 memmove 1.str系列的函数只能处理字符串——>必须带有'\0'2.memcpy内存处理函数:不涉及'\0',需要包含头文件 string.h3.source的 ...

  8. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  9. C/C++之Memcpy and memmove

    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...

随机推荐

  1. 关于UIButton中的ContentEdgeInsets的深入研究

    UIButton的contentEdgeInsets属性的深入研究 由于用UIButton这个属性做过一些东西,但是对它的规律始终不太了解,虽然苹果官方文档的解释大体上可以理解为,这个属性设置的是内边 ...

  2. 漫谈linux文件IO

    在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用 ...

  3. pyqt menu子级方向例子学习

    代码和UI文件:http://yunpan.cn/QCkXbX8mnSNke(提取码:51e1) 图片如: 代码如下: from PyQt4 import QtCore,QtGui,Qt import ...

  4. UITextView 输入长度限制

    //还可以输入的长度. - (void)textViewDidChange:(UITextView *)textView { UITextRange *markRange = textView.mar ...

  5. 学习Swift中的CoreImage(图形核心编程)

    Core Image是一个可以让你轻松使用图形过虑器的强力框架.在这里你几乎可以获得所有不同种类的效果,比如修改图像饱和度,色彩范围,亮度等.它甚至也可以利用CPU或者GPU来处理图像数据并且它的速度 ...

  6. Android编译过程详解(二)

    通过上篇文章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执行完上述两个命令后, 我们就可以进行编译android了. 1. make  执行ma ...

  7. 不用position,让div垂直居中

    先弄懂after伪类的用法,就可以很容易理解了. <!DOCTYPE html> <html lang="en"><head> <meta ...

  8. 前端--关于客户端javascript

    浏览器中的Javascript 客户端javascript就是运行在浏览器中的javascript,现代的浏览器已经有了很好的发展,虽然它是一个应用程序,但完全可以把它看作是一个简易的操作系统,因为像 ...

  9. iOS 面试题 3

    0.请写出代码,用blocks来取代上例中的protocol,并比较两种方法的优势.实际应用部分?请写出代码,用blocks取代协议或回调方法 声明: #import <Foundation/F ...

  10. Xcode no visible @interface for xxx declares the selector errors