zoukankan      html  css  js  c++  java
  • C/C++ memmove与memcpy的区别及实现

    1.与字符串函数strcpy区别:

    • memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
    • memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至''停止。

    2.函数说明:         

    1. memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
    2. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

    3.拷贝情况:

          拷贝的具体过程根据dst内存区域和src内存区域可分为三种情况:

          1.当src内存区域和dst内存区域完全不重叠

    2.当src内存区域和dest内存区域重叠时且dst所在区域在src所在区域前

     3.当src内存区域和dst内存区域重叠时且src所在区域在dst所在区域前

     

         上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

    4.代码实现

    memcpy:

     1 void* _memcpy(void* dest, const void* src, size_t count)
     2 {
     3     assert(src != nullptr&&dest != nullptr);
     4     //判断dest指针和src指针是否为空,若为空抛出异常
     5     char* tmp_dest = (char*)dest;
     6     const char* tmp_src = (const char*)src;
     7     //将指针dest和指针src由void强转为char,
     8     //使得每次均是对内存中的一个字节进行拷贝
     9     while (count--)
    10         *tmp_dest++ = *tmp_src++;
    11     return dest;
    12 }

    memmove:

     1 void* _memmove(void* dest, const void* src, size_t count)
     2 {
     3     assert(src != nullptr&&dest != nullptr);
     4     //判断dest指针和src指针是否为空,若为空抛出异常
     5     char* tmp_dest = (char*)dest;
     6     const char* tmp_src = (const char*)src;
     7 
     8     if (tmp_src < tmp_dest)//当src地址小于dest地址时,从头进行拷贝
     9         while (count--)
    10             *tmp_dest++ = *tmp_src++;
    11     else if (tmp_src > tmp_dest)//当src地址大于dest地址时,从后进行拷贝
    12     {
    13         tmp_src += count - 1;
    14         tmp_dest += count - 1;
    15         while (count--)
    16             *tmp_dest-- = *tmp_src;
    17     }
    18     //else(tmp_src==tmp_dest) 此时不进行任何操作
    19     return dest;
    20 }
  • 相关阅读:
    根据会员权限显示指定字段教程与源码
    关键字替换排除HTML标签属性字符
    C# 图片处理(压缩、剪裁,转换,优化)
    点击按钮后表单自动提交的问题
    浏览器中添加收藏当前网页
    Javascript基础知识整理
    JS中不同类型的值比较问题
    ACM训练场
    sencha/extjs 动态创建grid表格
    sencha 报错问题汇总
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12396331.html
Copyright © 2011-2022 走看看