
区别:
memcpy和memmove()都是C语言的库函数。在头文件string.h中,功能是复制一定长度内存的内容。原型如下:
void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);
它们的功能相同。唯一的区别是,当内存在本地重叠时,memmove保证复制结果正确,而memcpy不保证复制结果正确。
一、 memcpy函数

Memcpy原型:
void *memcpy(void *dest, const void *src, size_t n);
说明:
memcpy()函数将src存储器中的n个字节复制到dest存储器区域,但是源和目标存储器区域不能重叠。
返回值:

memcpy()函数返回一个指向dest的指针。
二、记忆功能
Memmovey原型:
void *memmove(void *dest, const void *src, size_t n);
说明:

memmove()函数将src内存中的n个字节复制到dest内存区域,但是源内存和目标内存可以重叠。
返回值:
memmove函数返回一个指向dest的指针。
从上面的描述可以看出,两者之间的唯一区别是,在处理重叠区域时,memmove可以正确完成相应的副本,但是memcpy无法。
内存覆盖有两种情况,

首先看一下memcpy()和memmove()这两个函数的实现:
void* my_memcpy(void* dst, const void* src, size_t n)
{
char *tmp = (char*)dst;
char *s_src = (char*)src;
while(n--) {
*tmp++ = *s_src++;
}
return dst;
}
从实现中可以看出,memcpy()从内存的左侧开始逐字节将src的内容复制到dest的内存中。此实现导致图中的第二个内存重叠。在这种情况下,后两个字节的复制值显然不是原始值,而新值已成为src的前两个字节。
对于第一种内存覆盖情况,可以使用此memcpy复制方法。
Memmove在第二种内存覆盖情况下改进了memcpy。改进后的代码如下:
void* my_memmove(void* dst, const void* src, size_t n)
{
char* s_dst;
char* s_src;
s_dst = (char*)dst;
s_src = (char*)src;
if(s_dst>s_src && (s_src+n>s_dst)) { //-------------------------第二种内存覆盖的情形。
s_dst = s_dst+n-1;
s_src = s_src+n-1;
while(n--) {
*s_dst-- = *s_src--;
}
}else {
while(n--) {
*s_dst++ = *s_src++;
}
}
return dst;
}
在第二次内存覆盖的情况下,memcpy将出错,但memmove将正常工作。
启发我!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-314157-1.html
希望双方透露更多细节
顶顶