MBuger的博客

与其临渊羡鱼,不如退而结网。

memcpy,memmove函数实现及区别

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


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MBuger/article/details/52372467
个人分类: C和C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

memcpy,memmove函数实现及区别

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭