strcpy vs memcpy vs memmove

来源:互联网 发布:网络黄金egd充值 编辑:程序博客网 时间:2024/06/05 21:58

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

原创粉丝点击