memcpy和memmove都是C语言的库函数,在头文件string.h中,作用是内存拷贝,原型如下“

它们的作用都是内存拷贝,唯一的区别是,当内存发生局部重叠时,memmove保证了拷贝的结果是正确的,但是memcopy不一定是正确的。但是memcpy比memmove速度快。
memcpy
memcpy函数从src内存中拷贝了count字节到dest内存区域,但是src和dest的内存区域不能重叠。
memmove
memcpy函数从src内存中拷贝了count字节到dest内存区域,但是src和dest的内存区域可以重叠。
memcpy和memmove对比:
内存重叠区域有两种情况:

memcpy函数实现:
void *my_memcpy(void *dst,void *src,size_t n)
{
char *tmp = (char *)dst;
char *p = (char *)src;
while(n--)
{
*tmp++ = *p++;
}
return dst;
}
memcpy在第二种内存覆盖情况下,最终不会得到正确的结果,会有踩内存现象,第一种内存覆盖可以得到正确的结果。
memmove函数实现:
void *my_memmove(void *dst,void *src,size_t n)
{
char *p1 = (char *)dst;
char *p2 = (char *)src;
if(p1 > p2 && p2+n > p1)//对于第二种内存覆盖进行了讨论
{
p1 = p1+n-1;
p2 = p2+n-1;
while(n--)
{
*p1-- = *p2--;
}
}
else
{
while(n--)
{
*p1++ = *p2++;
}
}
return dst;
}
memmove针对第二种内存覆盖进行了改进,所以memmove能正常工作。
本文详细解析了C语言中的memcpy和memmove函数,探讨了两者在内存拷贝过程中的区别,尤其是在内存重叠情况下的表现。memcpy适用于非重叠区域的快速拷贝,而memmove则确保了即使在内存重叠时也能正确拷贝。
7608

被折叠的 条评论
为什么被折叠?



