memcpy和memmove的区别

   memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,函数原型如下:

十载的杞县网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整杞县建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“杞县网站设计”,“杞县网站推广”以来,每个客户项目都认真落实执行。

void *my_memcpy(void *dest, const void *src,size_t count)

void *my_memmove(void *dest, const void * src, size_t count)

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。


memcpy和memmove的区别

第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。

第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。

实际上,memcpy只是memmove的一个子集。

memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比

memmove的速度要快一些,如:

char s[] = "1234567890";

char* p1 = s;

char* p2 = s+2;

memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了。

关于memmove的实现:

void *my_memmove(void *dest, const void * src, size_t count)

{

char *pDest = (char *)dest;

char *pSrc = (char *)src;

assert(dest);

assert(src);

if ((pDest >= pSrc) && (pDest <= pSrc + count))

{

while (count--)

{

*(pDest + count) = *(pSrc + count);

}

}

else//不重叠

{

while (count--)

{

*pDest++ = *pSrc++;

}

}

return dest;

}

关于memcpy的实现:

void *my_memcpy(void *dest, const void *src,size_t count)

{

assert(dest);

assert(src);

char *pDest = (char*)dest;

char *pSrc = (char*)src;

if ((pDest >= pSrc) && (pDest <= pSrc + count))

{

while (count--)

{

*(pDest + count) = *(pSrc + count);

}

}

else

{

while (count--)

{

*pDest++ = *pSrc++;

}

}

return dest;

}

 




网站栏目:memcpy和memmove的区别
本文URL:http://csdahua.cn/article/jhiosd.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流