strcpy vs memcpy vs memmove

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011076940/article/details/73732267

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的区别

猜你喜欢

转载自blog.csdn.net/u011076940/article/details/73732267