模拟实现memmove

memmove():将 num 字节的值从所指向的位置复制到目标所指向的内存块。复制就像使用中间缓冲区一样进行,允许目标重叠。

当我们要模拟实现memmove函数时得考虑到字符未被移动而被其他字符覆盖

int main()
{
	int a1[10] = { 1,2,3,4,5,6,7,8,9,20 };
	int a2[5] = { 0 };
	int sz1 = sizeof(a1) / sizeof(a1[0]);
	my_memmove(a1, a1 + 2, 20);
	for (int i = 0; i < sz1; i++)
	{
		printf("%d ", a1[i]);
	}
	return 0;
}

就比方说上面这段代码,我们要用my_memmove()获取我们想要得到的数组

3,4,5,6,7,6,7,8,9,20

但是如果原数组在移动时先将7覆盖5的话,那5这个数据便会缺失,使得我们的my_memmove()无法与memmove做到同样效果。

#include<stdio.h>
void* my_memmove(void* x, void* y, size_t mun)
{
	void* ret = x;
	if (x < y)
	{
		while (mun--)
		{
			*(char*)x = *(char*)y;
			x = (char*)x + 1;
			y = (char*)y + 1;
		}
	}
	else
	{
		while (mun--)
		{
			*((char*)x + mun) = *((char*)y + mun);

		}
	}
	return ret;
}

所以可以分两种情况来进行数据移动,如上提供的代码一般。用一个参数mun控制移动数据的长度,移动量为地址*x与地址*y之间的距离量。倘若在同一组数组中,要移动数据的起始地址(*y)高于移动的末尾位置(*x),可以先从最终位置开始进行数据拷贝,在提供的数组中将*y的数据覆盖*x的数据;要移动数据的起始地址低于移动的最终位置,则将起始地址和最终位置都加上移动量,相当于从要移动的数据段的末尾开始拷贝数据

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值