今天看到书上降到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. C++私有构造函数

    一. 类的构造函数一般是public的,但是也可以是private的.构造函数为私有的类有这样的特点: <1>不能实例化:因为实例化时类外部无法访问其内部的私有的构造函数: <2&g ...

  2. 《Java程序员面试笔试宝典》之组合与继承有什么区别

    组合和继承是面向对象中两种代码复用的方式.组合是指在新类里面创建原有类的对象,重复利用已有类的功能.继承是面向对象的主要特性之一,它允许设计人员根据其它类的实现来定义一个类的实现.组合和继承都允许在新 ...

  3. Android NDK R9d 安装

    NDK是一个工具集,可让您实现您的应用程序使用本机代码的语言,如C和C + +.Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Go ...

  4. 再一次强调,ORACLE外键必须加索引

    外键加索引是常识,必须牢记.本来不想写这样的简单案例.可是连续遇到好几起外键不加索引导致性能问题,所以还是写一下. 一个兄弟问我 delete from Sa_Sales_Comm_Detail s  ...

  5. .Net+EF连接Oracle 10、11 开发,ODAC安装配置与使用详解

    Oracle数据访问组件 (ODAC)  全称:Oracle Data Access Components 优点:由于微软在.net framework4中会将System.Data.OracleCl ...

  6. javascript 阻止多次点击造成的轮播混乱

    function nextSlider(){ //使用b作为开关,只有动画完成后才能进行下一次运动 if(b){ //如果b为真,则马上设置b为false,如果startmove的回调没有重新设置b的 ...

  7. Android Studio稍微较新的版本下载

    ALL ANDROID STUDIO PACKAGES-V1.4.1.2422023 Select a specific Android Studio package for your platfor ...

  8. ios 网络数据下载和JSON解析

    ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...

  9. Linq的查询操作符

    Linq有表达式语法和调用方法的语法.两者是可以结合使用,通常情况下也都是结合使用.表达式语法看上去比较清晰而调用方法的语法实现的功能更多,在此文章中介绍的是表达式语法.方法语法可以看System.L ...

  10. 剑指offier第三题

    package 剑指office; /* * 第三题二维数组查找 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序, * 每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维 ...