模拟memcpy和memmove函数,以及他们的区别。。

本文详细解析了memcpy和memmove这两个函数的区别与实现原理。memcpy主要用于无类型的数据复制,而memmove则能处理内存重叠的情况。通过具体的代码示例展示了它们如何工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

memcpy是无类型拷贝,也是一个返回值为void *类型的函数,接受的两个参数也是void *类型,还有一个参数是要拷贝的大小。

具体函数怎么实现,看代码:

void *my_memcpy(void *dest,const void *src,size_t count)
{
	void *p = dest;
	assert(dest);
	assert(src);
	while(count--)
	{
		*(char*)p = *(char*)src;
		p = (char *)p +1;
		src = (char*)src +1;
	}
	return dest;
}
代码实现起来很简单。唯一要注意的就是参数是void *的必须要强转为char*型,进行一个字符一个字符的拷贝。

再看我们的memmove函数,这个函数和memcpy比较相像,来我们来看代码:

void *my_memmove(void *dest,const void *src,size_t count)
{
	void *p = dest;
	if((dest>src) && (char *)dest < ((char *)src +count))//说明内存重叠
	{
		dest = (char *)dest+count - 1;
		src = (char *)src+count - 1;
		while(count--)
		{
			*(char *)dest = *(char *)src;
			dest = (char *)dest - 1;
			src = (char *)src - 1;
		}
	}
	else
	{
		while(count--)
		{
		*(char*)dest = *(char*)src;
		dest = (char *)dest +1;
		src = (char*)src +1;
		}
	}
	return p;
}

memcpy与memmove两个最大的区别就是处理内存重叠问题,memmove可以处理内存重叠,而memcpy不行,所以看

上面memmove函数加了一个判断,也就是当目的地址大于源地址并且目的地址小于源地址加上要拷贝字长,那么就内存重叠。

处理内存重叠的办法呢,就是让拷贝从后向前拷贝。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值