memmove详解与模拟实现

一.menmmove函数原型及其功能

原型:

void* memmove(void* dest,const void* src,size_t size)
//size的单位:字节

功能:
从src的位置开始,向后拷贝size个字节的数据到dest的位置。功能与memcpy相同,但有以下几点这注意:
1.memmove与memcpy不同之处在于,memmove处理的源内存块和目标内存块是可以重叠的;
2.若出现源空间与目标空间重叠的情况,要使用memmove函数进行处理。

二.源与目标内存位置的图解

在这里插入图片描述

三.实现时值得注意的点

若出现上述图解的第二种情况,则需要在是实现时将拷贝的顺序变为从后向前拷贝,以避免出现前边拷贝的内容被后边拷贝的内容覆盖,导致代码运行结果达不到预期。

四.模拟实现

void* my_memmove(void* dest,const void* src,size_t size)
{
  assert(dest&&src);
  char* ret=(char*)dest;//用于保存目标内存的起始位置
  
   //考虑可能出现的内存重叠的情况,并对其进行处理
   if(src <= dest || ((char*)src+size >= (char*)dest))
    {
       char* p1=(char*)dest;
       char* p2=(char*)src;
       //此处不能用--,不然会出现少拷贝一个字节的情况,原因:参照--操作的的特点
       while(size)
       {
         *(p1 + size - 1)=*(p2 + size - 1);
         //从后向前拷贝
         size--;
       }
     }
     //其他便与memcpy一样,处理内存不重叠的情况
     else
       {
           while(size)
           {
              (char*)dest=(char*)src;
              dest=(char*)dest+1;
              src=(char*)src+1;
               size--;
            }
        }
        return (ret);
   }

测试结果

int main()
{
   char str1[] = "asdfg";
   char str2[]="zxcvb";
   my_memmove(str1+1,str1, 2);
   memmove(str2+1,str2,2);
   
   puts(str1);
   puts("\n");
   puts(str2);

   system("pause");
   return 0;
}

测试截图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值