C/C++中memmove和memcpy的区别

本文详细解析了memcpy与memmove两个内存拷贝函数的区别及应用场景。memcpy用于非重叠内存块的拷贝,而memmove则能妥善处理重叠内存的情况。文章还对比了这两个函数与字符串拷贝函数strcpy的不同之处。

memcpy、memmove与字符串函数strcpy区别

memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。

memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。

函数说明     

1.memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。

2.memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

代码实现

char *strcpy(char *dst, const char *src)    // 实现src到dst的复制
{
    if(dst == src) return dst;              //源码中没有此项
   assert((dst != NULL) && (src != NULL)); //源码没有此项检查,判断参数src和dst的有效性
  char *cp = dst;                         //保存目标字符串的首地址
  while (*cp++ = *src++);                 //把src字符串的内容复制到dst下
  return dst;
}
void* _memcpy(void* dest, const void* src, size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判断dest指针和src指针是否为空,若为空抛出异常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;
	//将指针dest和指针src由void强转为char,
	//使得每次均是对内存中的一个字节进行拷贝
	while (count--)
		*tmp_dest++ = *tmp_src++;
	return dest;
}
void* _memmove(void* dest, const void* src, size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判断dest指针和src指针是否为空,若为空抛出异常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;

	if (tmp_dest < tmp_src)//当dest地址小于src地址时,从前向后进行拷贝
		while (count--)
			*tmp_dest++ = *tmp_src++;
	else if (tmp_dest > tmp_src)//当dest地址大于src地址时,从后向前进行拷贝
	{
		tmp_src += count - 1;
		tmp_dest += count - 1;
		while (count--)
			*tmp_dest-- = *tmp_src--;
                tmp_dest=tmp_dest+count;
	}
	//else(tmp_src==tmp_dest) 此时不进行任何操作
	return dest;
}

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值