zoukankan      html  css  js  c++  java
  • 关于memcpy和memmove的一点说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是

    实现同样的功能,没有接触到其不同。

     

    memcpy和memmove在MSDN的定义如下:

     

    从两者的声明来看的确没有区别,我们来看这样一个例子

     

    当我们需要将char* src="abcde"这个字符串全部copy到dest中然而src与dest在内存中大概是这样存在的:

    内存地址   低------>高

    1   src      dest
    2    1    2    3    4    5      6
    3  [ a ][ b ][ c ][ d ][ e ][ '' ][  ][  ][  ][  ][  ][  ][  ]

    src地址为内存1,目的地址为内存2此时很明显内存出现了重叠,当我们拷贝字符a到第三个内存位置的时

    a将覆盖src内存中的第三个字符 这种情况在memcpy未定义然而memmove却给出了正确的处理方式

     

    解决方法,试想当我们先将dest地址移动dest+n-1同时src地址移动src+n-1这样再从src的最后一个元素开

    始逐个向前拷贝到dest中就完美的避免了内存重叠导致的元素覆盖问题呢

    下面我们根据memcpy和memmove给出自己的实现:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void *memcopy( void *dest, const void *src, size_t count )
     5 {
     6     if(dest==NULL||src==NULL)
     7         return NULL;
     8     char* Dest=(char*)dest;
     9     const char* Src=(char*)src;
    10     
    11     int i=0;
    12     
    13     while(i<count)
    14     {
    15         *Dest++=*Src++;
    16         i++;
    17     }
    18     
    19     return dest;
    20 }
    21 
    22 void *memmove(void *dest,const void *src,size_t count )
    23 {
    24     if(dest==NULL||src==NULL)
    25         return NULL;
    26 
    27     char* Dest=(char*)dest;
    28     const char* Src=(char*)src;
    29     
    30     int i=0;
    31     if(src>dest)
    32     {
    33         while(i<count)//正向拷贝
    34         {
    35             *Dest++=*Src++;
    36             i++;
    37         }
    38     }
    39     else
    40     {
    41         Dest=Dest+count-1;//反向拷贝
    42         Src=Src+count-1;
    43 
    44         while(i<count)
    45         {
    46             *Dest--=*Src--;
    47             i--;
    48         }
    49     }
    50 
    51     
    52     
    53     return dest;
    54 }
    55 
    56 
    57 
    58 void main()
    59 {
    60     char dest[80];
    61     memset(dest,'',80);
    62     char* src="memcpyteststring";
    63     int n;
    64     cout<<"How many char you want to copy from src to dest(memcpy): ";
    65     cin>>n;
    66     cout<<"The dest string is: "<<(char*)memcopy(dest,src,n)<<endl;
    67     cout<<"How many char you want to copy from src to dest(memcpy): ";
    68     cin>>n;
    69     cout<<"The dest string is: "<<(char*)memmove(dest,src,n)<<endl;
    70     return;
    71 }

    运行截图:

     

     

  • 相关阅读:
    Atitit  Uncaught (in promise) SyntaxError Unexpected token < in JSON at position 0
    Atitit  验证 数字验证 非空验证的最佳算法  h5
    Atitit 转移特效attilax总结
    Atitit Loading 动画效果
    Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型  橄榄型 直板型
    Atitit hibernate3 hinernate4 hibernate5新特性attilax总结
    Atitit js es5 es6新特性 attilax总结
    Atitit mybatis 3 3.2 3.3  3.4 新特性attilax总结
    Atitit spring 3.0 3.1 3.2 4.0 4.3 5.0 新特性
    Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性
  • 原文地址:https://www.cnblogs.com/vpoet/p/4673772.html
Copyright © 2011-2022 走看看