memcpy与memmove

目录

memcpy

声明

描述

模拟实现

缺点

memmove

声明

描述

模拟实现

图解

代码实现


memcpy

声明

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

描述

将src中的count个字节复制到dest中(dest与src可以是任意类型)。

模拟实现

void* my_memcpy(void*dest,const void*src,int count)
{
    arrest(dest&&src);
	char* p1 = dest;
	char* p2 = src;
	while (count--)
	{
		*p1++ = *p2++;
	}
	return dest;
}

缺点

该函数只能解决内存不重叠的问题,若遇到内存重叠就需要用到memmove

memmove

声明

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

描述

 与memcpy相同的地方是可以将src中的count个字节复制到dest中,但是memmove的功能更加强大,内存重叠与内存不重叠的问题它都可以解决。

模拟实现

图解

(1)src在dest的前面(src<dest) 

  将1 2 3 4复制到4 5 6 7的位置上,若按照1 -> 4     2->5    3->6     4->7  这样从前到后的顺序,到要复制4的时候会发现,4的位置上已经不再是4,而是1,这样复制就有问题。

  这时,我们就需要从后往前的顺序复制。按照4->7    3->6    2->5     1->4这样顺序就不会有问题了。

(2)src在dest的后面(src>dest)

 此时如果继续按照从后往前就会出现问题,这就需要我们从前往后复制。

代码实现

void* my_memmove(void* dest, const void* src, int count)
{
    assert(dest&&src);
	char* p1 = dest;
	char* p2 = src;
	if (src > dest)
	{
		while (count--)
		{
			*p1++ = *p2++;
		}
	}
	else
	{
		while (count--)
		{
			*(p1 + count) = *(p2 + count);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值