您的位置:首页 > 其它

memcpy,memmove函数实现及区别

2016-08-30 19:57 453 查看

1 功能

memcpy:内存拷贝函数。void*memcpy(void* dest,void* src,size_t n),memcpy函数复制src指向的空间里前n个         字节到dest指向的空间。这里与strcpy不同的是strcpy函数只能拷贝字符串,而memcpy拷贝的是内存里的东         西,包括字符串,整型,结构体等等。
memmove:void* memmove(void* dest,void* src size_t n),memove函数的返回类型和参数与memcpy函数一样,          他们的功能也是一样的,都是复制src所指向空间里的前n个字节到dest所指向的空间。唯一的区别是,            memcpy函数无法保证当内存重叠时拷贝的结果依然正确,而memmove函数可以做到。

2 区别

    如图所示,当使用memcpy进行内存拷贝时,第一种情况可以正常的得到拷贝内容,不存在内存重叠的情况。



    但是当遇到如下图所示的情况,也就是内存重叠的情况时,就会发生内容丢失的情况。



    上图所示的情况当src的前一个字节拷贝到dest时,src所需拷贝的最后一个字节由于和dest内存重叠,所以其内容就变成了src的第一个字节的内容,这就会导致src原本的最后一个字节内容丢失。
这个时候就需要使用memmove函数。

3 代码实现

memcpy
void* my_memcpy(void* dest,void* src,size_t n)
{
assert(dest);
assert(src);
char* pdest = (char*)dest;
char* psrc = (char*)src;
while ((n--)&&(*pdest++ = *psrc++))
{
;
}
return dest;
}
memmove
void* my_memmove(void* dest, void* src, size_t n)
{
assert(dest);
assert(src);
char* pdest = (char*)dest;
char* psrc = (char*)src;
if (src > dest)
{
while ((n--) && (*pdest++ = *psrc++))
{
;
}
}
else
{
char* ppdest = pdest + n -1;
char* ppsrc = psrc + n -1;
while ((n--) && (*ppdest-- = *ppsrc--))
{
;
}
}
return dest;
}

4 安全性

    在strcpy,strncpy,memcpy和memmove这四个库函数中,安全性是递增的,前三个函数均没有考虑到内存重叠的问题,所以相对来说memmove函数的安全性最高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: