模拟实现memmove

memmove函数的作用:

memmove函数的作用与memcpy的作用相似

都是将内存复制到另一个区域

但是他们的区别在于memmove函数可以进行同内存复制,但是memcpy函数不可以(在vs环境下也可以)

我绘制了以下图片理解:

我们设置了arr1后两个地址并选中了5个数字,使他在同内存中进行复制

但是要怎么实现呢

#define _CRT_SECURE_NO_WARNINGS 1
//模拟实现memmove
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_memmove(void* dest, void* src, size_t num)
{
	assert(dest);
	assert(src);
	void* ret = dest;//提供一个初始地址
	if (src < dest)
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);//后——>前

		}
	}
	else
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;//前——>后
			((char*)dest)++;
			((char*)src)++;
		}
	}
	return ret;
}
int main()
    {
		int arr[] = { 0 };
		int arr1[] = { 1,2,3,4,5,6,7,8 };
		my_memmove(arr1 + 2, arr1, 20);
		for (int i = 0; i < 8; i++)
		{
			printf("%d", arr1[i]);
		}
		return 0;
	}

 

我们要把src复制到dest中,当src和dest是同一块区域时,要判断哪个位置在前哪个在后;

具体可以分为两种情况

1.dest<src

此时直接从前往后复制不会出现问题

2.dest>src

此时从前往后复制会直接导致src之后的内存遭到改变,因此应该从后向前进行复制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值