strcpy vs memcpy vs memmove

strcpy和memcpy主要有以下三方面的区别

  1. 复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
  2. 复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出,memcpy则是根据其第3个参数决定复制的长度;
  3. 用途不同,通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
strcpy和memcpy都假定输入内存地址不重叠,所以并不安全。而memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。复制后src内容 会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。




代码如下:

char* strcpy(char* des,const char* source)      // 假定src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串
{
  char* r=des;
   assert((des != NULL) && (source != NULL));
   while((*r++ = *source++)!='\0');
  return des;
}
void *memcpy(void *dest, const void *src, size_t n);
void *memmove( void* dest, const void* src, size_t count )
{
     char *dp = (char *)dst;
     char *sp = (char *)src; 
     assert((src!=0)&&(dst!=0)&&(count>0));                 // not null 
     if(sp>dp||(sp+count)<dp)                               // 内存没有重叠或者重叠了不影响正向拷贝
     { 
         while(count--)  *(dp++) = *(sp++);
         *dp = '\0';
     }
     else if(sp<dp)                                        // 重叠(此时条件 sp<dp<(sp+count)),如果sp==dp则快速的返回
     {                                                     // 反向拷贝  
          sp += count; 
          dp += count; 
          *dp = '\0'; 
          while(count--) *(--dp) = *(--sp); 
     }
     return dst;
}




References

strcpy、memcpy、memmove的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值