模拟实现C库的memmove和memcpy

memmove和memcpy是做什么的?

memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容。

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

memcpy

void *memcpy(void *dst, const void *src, size_t count);  

memcpy()函数从src内存中拷贝n个字节到dest内存区域,但是源和目的的内存区域不能重叠。
memcpy()函数返回指向dest的指针

memmove

void *memmove(void *dst, const void *src, size_t count);  

memmove() 函数从src内存中拷贝n个字节到dest内存区域,但是源和目的的内存可以重叠。
memmove函数返回一个指向dest的指针。

memmove与memcpy出现内存重叠问题

这里写图片描述
第一种情况下,拷贝重叠的区域不会出现问题,内容可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,这是有问题的。
实际上,memcpy只是memmove的一个子集。

模拟实现memcpy与memmove

void *my_memcpy (void * dest,const void * src,int count)
{
       void *ret = dest;
       assert(dest != NULL);
       assert(src != NULL);
       while (count )
      {
            *(( char*)dest ) = *((char*) src);
             dest = (char *)dest+1;
             src = (char *)src+1;
             count--;
      }
       return ret ;
}
void* my_memmove (void * dest, void *src, int sz )
{
       char *sp = dest;
       assert(dest );
       assert(src );
       //这里为了防止拷贝错误做了判断
       //如果目标空间大于源空间并且会出现重叠,这时需要从后向前拷贝,这样不会出现错误。
       if (dest > src && ( char *)dest < (char *) src+sz )
      {
             while (sz --)
            {
                  *(( char *)dest +sz) = *(( char*)src +sz);
            }
      }
      //否则,从前向后一个一个拷贝即可。
       else
      {
             while (sz --)
            {
                  *(( char *)dest ) = *((char*) src);
                   dest = (char *)dest+1;
                   src = (char *)src+1;
            }
      }
       return sp ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值