memcpy函数及memmove函数

本文介绍了memcpy函数的功能,即数组间的拷贝,并通过示例解释了缓冲区重叠可能导致的问题。当出现缓冲区重叠时,使用memcpy可能会出错。为解决这一问题,文章提到了memmove函数,它可以安全地处理重叠缓冲区的拷贝。

memcpy函数

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

功能也是完成数组之间的拷贝
memcpy函数的实现如下

void* my_memcpy(void* dest, void* src, size_t num){
	if (dest == NULL || src == NULL)
	//参数校验
		return dest;
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
	//类型强转,void是空指针,不能进行解引用
	for (size_t i = 0; i < num; i++){
		*pdest = *psrc;
		++pdest;
		++psrc;
	}
	return dest;
}

memcpy也有一个坑,就是缓冲区重叠,我在这里画了一张图方便理解
在这里插入图片描述
绿色区域为目标数组,此时拷贝后的值为{1,1,1,1}
这里我们就要讲一下缓冲区重叠的概念
目标缓冲区的起始位置如果在缓冲区之内,如果memcpy就会出错
目标缓冲区的起始位置如果在缓冲区之外,这时就不会出错
在这里插入图片描述

memmove函数就可以避免这种缓冲区重叠。
具体实现如下

void* my_memmove(void* dest, void* src, size_t num){
	if (dest == NULL || src == NULL){
		return dest;
	}
	char* pdest = (char*)dest;
	char* psrc = (char*)src;
	if ((pdest >= psrc)&&(pdest < psrc + num)){
		//缓冲区重叠,从后往前拷贝
		//位置指向后
		pdest = pdest + num - 1;
		psrc = psrc + num - 1;
		for (size_t i = 0; i < num; i++){
			*pdest = *psrc;
			--pdest;
			--psrc;
		}
	}
	else{
		for (size_t i = 0; i < num; i++){
			*pdest = *psrc;
			++pdest;
			++psrc;
		}
		//不重叠
	}
	return dest;
}
int main(){
	int arr[50] = { 1, 2, 3, 4 };
	my_memmove(arr+1, arr, 16);
	for (int i = 1; i <= 4; i++){
		printf("%d\n", *(arr+i));
	}
	system("pause");
	return 0;
}

让我们看一下结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值