memcpy和memmove的区别

本文对比了memcpy与memmove在处理内存重叠时的行为差异,特别是在源与目标内存区域部分或全部重叠的情况下。通过具体实例展示了两种函数的实现方式及其结果的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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使用后只拷贝


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值