1.与字符串函数strcpy区别:
- memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
- memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至' '停止。
2.函数说明:
- memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
- memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。
3.代码实现
1)memcpy
void* memcpy(void* memTo, void* memFrom, size_t size) { assert(memTo != NULL && memFrom != NULL); char* temFrom = (char*)memFrom; char* temTo = (char*)memTo; while(size-- > 0) *temTo++ = *temFrom++; return memTo; }
挺简单的,使用深复制
2)memmove
void* memmove(void* dst,const void* src,size_t count) { void* ret = dst; //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容 if (dst <= src || (char*)dst >= ((char*)src + count)) { //从前往后复制,则不会出现覆盖src中没有复制的内容 while(count--) { *(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制 dst = (char*)dst + 1; //移动一个字节 src = (char*)src + 1; } } else { //从后往前复制,则不会出现覆盖src中没有复制的内容 dst = (char*)dst + count - 1;//移动到末尾 src = (char*)src + count - 1; while(count--) { *(char*)dst = *(char*)src; dst = (char*)dst - 1; //移动一个字节 src = (char*)src - 1; } } //返回dst的头指针,还方便左值操作。 //如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count); return ret; }
代码中描述的就是以下两种情况
最后,memcpy在内存没有重复的情况下能够正确复制,若有重叠情况则复制结果错误,但是它的效率比memmove高。所以,在确定没有重复的情况下用memcpy,在不确定是否有内存重复的情况用memmove。