zoukankan      html  css  js  c++  java
  • memmove和memcpy函数的区别及实现

    一、memmove()和memcpy()函数和strcpy()函数的区别;

    (1)使用的类型不同,strcpy()函数只对字符串进行操作;memmove()和memcpy()函数对所有类型都适用,为内存拷贝; 
    (2)strcpy()以’’为拷贝的结束条件;而memmove()和memcpy()函数则是以第三个参数num进行控制拷贝;

    二、函数说明:

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

    三、memmove()和memcpy()函数的区别和联系:

    相同点: 两个都是内存拷贝,对所有类型都适用; 
    不同点: 
    (1)memcpy()函数是从前往后拷贝;假入出现内存重叠的现象;拷贝结果可能出错; 
    (2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些情况;保证拷贝的正确性;

    综上:在现实中使用memmove()函数会比较好一点;

    四、各种拷贝情况:

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

    五、模拟实现:

    memcpy:

    
    
    //模式实现memcpy(不会解决内存重叠的问题,正序拷贝,适用于任何类型)
    void* MyMemcpy(void* dest,const void* src,size_t num)
    {
         char* dest_tmp=(char*)dest;//目标字符串
         const char* src_tmp=(const char*)src;//源字符串
         assert(dest&&src);
         while(num--)
         {
             *dest_tmp++= *src_tmp++;
         }
         return dest;
    }

    memmove:

    //模拟实现memove(会解决内存重叠的问题,加上了逆序拷贝,适用于任何类型)
    void* MyMemmove(void* dest,const void* src,size_t num)
    {
        char* dest_tmp=(char*)dest;
        const char* src_tmp=(const char*)src;
        assert(dest&&src);
        if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//情况2和情况1
        {
            while(num--)//正序复制
            {
                *dest_tmp++=*src_tmp++;
            }
        }
        else//情况3,逆序赋值
        {
            //调整指针到最后
            dest_tmp+=num-1;
            src_tmp+=num-1;
            while(num--)
            {
                *dest_tmp--=*src_tmp--;
            }
        }
        return dest;
    }



    转自:memmove和memcpy函数的区别及实现
  • 相关阅读:
    2019中山纪念中学夏令营-Day19 数论初步【GCD(最大公约数),素数相关】
    2019中山纪念中学夏令营-Day14 图论初步【dijkstra算法求最短路】
    2019中山纪念中学夏令营-Day12[JZOJ]
    2019中山纪念中学夏令营-Day9[JZOJ](第六次模拟赛)
    2019中山纪念中学夏令营-Day4[JZOJ]
    2019中山纪念中学夏令营-Day2[JZOJ]
    2019中山纪念中学夏令营-Day1[JZOJ]
    CCPC2019江西省赛-Problem G.Traffic
    T137223 节能主义
    T137226 彩虹海
  • 原文地址:https://www.cnblogs.com/BinBinStory/p/8000888.html
Copyright © 2011-2022 走看看