strcpy和memcpy主要有以下三方面的区别:
- 复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
- 复制的方法不同,strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出,memcpy则是根据其第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