memcpy和memmove的区别

1,函数声明

void* memcpy(void* dest,void* source,unsigned count);

void *memmove(void *dest, void *source, unsigned count);

memcpy和memmove都是对于内存的拷贝,当他们被应用在不同的内存区域拷贝(source和dest志向不同的内存区域)时,效果是一样的,

但是当source和dest的内存区域overlap时,使用着两个函数将会出现不同的现象。

这还取决于source和dest的大小

memmove的处理措施:

(1)当source的首地址等于dest的首地址时,不进行任何拷贝

(2)当source的首地址大于dest的首地址时,实行正向拷贝

(3)当source的首地址小于dest的首地址时,实行反向拷贝


2,测试结果

这里我做了一个测试,结果如下

condition:arr和arr1,arr2,arr3都是一个含有10个元素,从0-9

然后调用

memcpy((void*)arr, (void*)&arr[4], sizeof(int) * 6);

memcpy((void*)&arr[4], (void*)arr, sizeof(int) * 6);

memmove((void*)arr, (void*)&arr[4], sizeof(int) * 6);

memmove((void*)&arr[4], (void*)arr, sizeof(int) * 6);


result:

memcpy arr(src > des)
4       5       6       7       8       9       6       7       8       9
memcpy arr1(src < des)
0       1       2       3       0       1       2       3       0       1
memmove arr2(src > des)
4       5       6       7       8       9       6       7       8       9
memmove arr3(src < des)
0       1       2       3       0       1       2       3       4       5

唯一的不同在于当src < des时


3,原因


void* memcpy(void* dest, void* src, size_t n)
{
  char* d = (char*)dest;
const char* s = (const char*)src;
   while (n-–)
*d++ = *s++;
   return   dest;
}

void* memmove(void* dest, void* src, size_t n)
{  
  char* d = (char*)dest;
const char* s = (const char*)src;
if (s > d)
     {
          // start at beginning of s
  while (n--)
         *d++ = *s++;
     }
   else if (s < d)
     {
         // start at end of s
         d = d+n-1;
         s = s+n-1;
  
 while (n--)
         *d-- = *s--;
     }
     return  dest;
}
当src > des时,两者都是用前置拷贝

但是当src < des时,memcpy使用前置拷贝,memmove使用后只拷贝


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值