微软编译器中memcpy的文档为:
Copies bytes between buffers. More secure versions of these functions are available;
void *memcpy( void *dest, const void *src, size_t count );
Remarks:
memcpy copies count bytes from src to dest; wmemcpy copies count wide characters (two bytes). If the source and destination overlap, the behavior of memcpy is undefined. Use memmove to handle overlapping regions.
也就是说,memcpy的内存拷贝,要求dest和src的内存之间不能有重叠部分。例如
[A][B][C]
A、B、C表示三段连续的等长,且长度为L的内存空间,利用memcpy函数将地址为A,长度为2L的内存数据,复制到地址为B的空间是不可行的。MSDN中给出应该用memmove()代替。
对以上内容进行了测试,结果有些让人疑惑。
测试代码如下:
#include <iostream> #include <string.h> using namespace std; int main(int argc,char ** argv) { //s = aaaabbbcccc char s[256] = {'a','a','a','a','b','b','b','c','c','c','c'}; //memcpy(s,s+2,6); memmove(s,s+2,6); cout<<s<<endl; system("pause"); return 0; }
memcpy的dst和src之间有重叠部分,但memcpy和memmove得到的结果是相同的。并且从复制的逻辑上,得到的结果也是正确的。
疑惑,不知道memcpy和memmove的区别到底在哪里。