实现memmove函数

memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>  
void* Memcpy(void* dest, const void* src, size_t num)
{
	assert(src != NULL);
	assert(dest != NULL);
	char* psrc = (char*)src;
	char* pdest = (char*)dest;
	for (size_t i = 0; i < num; i++)
	{
		pdest[i] = psrc[i];
	}
	return dest;
}

void * Memmove(void * dest, const void * src, size_t num)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* psrc = (char*)src;
	char* pdest = (char*)dest;
	//1.缓冲区重合
	if (psrc<pdest&&psrc + num>pdest)
	{
		char* psrc_ = psrc + num - 1;
		char* pdest_ = pdest + num - 1;
		for (; psrc_ >= psrc; --psrc_, --pdest_)
		{
			*pdest_ = *psrc_;
		}
	}
	//2.缓冲区没重合
	else
	{
		Memcpy(dest, src, num);
	}
}

int main()
{
	char str[] = "memmove can be very useful......";
	Memmove(str + 20, str + 15, 11);
	puts(str);
	system("pause");
	return 0;
}

当缓冲区不重合时,memmove函数的作用和memcpy函数的作用相同;当缓冲区重合时,如下图所示:
在这里插入图片描述
如果直接从src处复制,则后面从7开始的元素就会被覆盖掉,导致数据丢失,但是如果从src的最后一个元素复制,则不会导致数据丢失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值