关闭

memcpy,memmove函数实现及区别

189人阅读 评论(0) 收藏 举报
分类:

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函数的安全性最高。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20591次
    • 积分:1021
    • 等级:
    • 排名:千里之外
    • 原创:84篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条