C语言实现memcpy、memmove

> 1.模拟实现memcpy函数

//------------my_memcpy;--拷贝任意类型的元素,通过字节拷贝
// 原理:给出目的地与起始地地址,按字节数单个拷贝,字节数为0时拷贝结束
// 格式:my_memcpy(dest,src,num)--num是需要拷贝的字节数
// 返回值:返回目的地的地址
// 功能:负责拷贝两块独立内存空间的数据,不能自己内部拷贝,实现重叠内存拷贝用memmove()
// 
//void* my_memcpy(void* dest, const void* src, size_t num)//void*泛型指针接收地址,应对不同类型的情况
//{
//	assert(dest && src);
//	void* ret = dest;
//	while (num--)//要拷贝的字节为0跳出循环
//	{
//		*(char*)dest = *(char*)src;
//		//强制类型转化为char*类型,每次指针加一跳过一个字节,解引用访问一个字节,精度最细,方便应对各种类型的元素的字节的拷贝
//		//dest = ((char*)dest)++;
//		//src = ((char*)src)++;
//		//这种写法实质上是:强制类型转化时创建了一个临时变量,对其解引用无意义,c++不支持这种写法,建议写成下列写法
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main()
//{
//	//整形
//	int arr[] = { 0,1,2,3,4,5,6,7,8 };//36byte
//	int arr2[20] = { 0 };
//	my_memcpy(arr2, arr, 36);
//	for (int i = 0; i < 9; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	//---如果你想把012345678拷贝成012301234,是不行的,因为在这个过程中
//	//--my_memcpy(arr2+4,arr2,36)在拷贝完3以后,想去拷贝4的时候发现源串的临时拷贝中的
//	//-已经先被改为0了
//	printf("\n");
//	//字符串
//	char str[] = "abcdef";
//	char str2[10] = { 0 };
//	my_memcpy(str2, str, 6);
//	printf("%s\n", str2);
//	return 0;
//}

> 2.模拟实现memmove函数

//-----------------my_memmove()
//格式:my_memmove(dest,src,num)--num是要拷贝的字节个数
//这个函数和my_memcpy的区别就是它可以处理重叠内存之间的数据的拷贝
//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//	//dest处于src的num个字节范围的前面
//    //此时只能从前向后拷贝
//	if (dest < src)
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	//1.dest处于src范围中间,此时只能从后向前拷贝
//	//2.dest处于src范围后面,也就是dest>src,此时可以任意方向拷贝
//	else
//	{
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)src + num);
//		}
//	}
//
//	return ret;
//}
//int main()
//{
//	//整形
//	int arr[20] = { 0,1,2,3,4,5,6,7,8 };
//	my_memmove(arr+3, arr, 20);//把01234拷贝过去34567的位置,一共20byte
//	for (int i = 0; i < 9; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//
//	int arr2[20] = { 0,1,2,3,4,5,6,7,8 };
//	my_memmove(arr2, arr2+3, 12);//把345拷贝过去012的位置,一共12byte
//	for (int i = 0; i < 9; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

久菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值