成都网站建设设计

将想法与焦点和您一起共享

memcpy和memmove的区别-创新互联

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

成都创新互联专业为企业提供玉山网站建设、玉山做网站、玉山网站设计、玉山网站制作等企业网站建设、网页设计与制作、玉山企业网站模板建站服务,10余年玉山做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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;

}

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


文章名称:memcpy和memmove的区别-创新互联
本文路径:http://chengdu.cdxwcx.cn/article/deocig.html