动态内存管理:模拟实现memcpy,memmove

memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:
void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count); 

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。


第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。

具体实现代码:

void* my_memcpy(void* dest, const void* src, int size)
{
	assert(NULL != dest&&NULL != src);

	void* ret = dest;

	while (size--)
	{
		*(char*)dest = *(char*)src;
		((char*)dest)++;
		((char*)src)++;
	}
	return (char*)ret;
}
//memmove
void* my_memmove(void* dest, void* src, int size)
{
	assert(NULL != dest&&NULL != src);
	char*ret = (char*)dest;

	if (dest > src && (char*)dest < (char*)src)
	{
		while (size--)
		{
			*((char*)dest + size) = *((char*)src + size);
		}
	}
	else
	{
		while (size--)
		{
			*(char*)dest = *(char*)src ;
			((char*)dest)++;
			((char*)src)++;
		}
	}
	return ret;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值