C语言模拟实现memcpy和memmove

memcpy函数

一.函数原型

在这里插入图片描述

  • 该函数有三个参数,第一个是指向目的内存块的一个指针,第二个是指向源数据的指针,第三个是要拷贝的字节数。
  • 函数的参数类型为void*,这样可以对各种类型的数据进行拷贝。
  • 函数的返回类型为void*, 指向目标空间的起始位置。

二.函数功能

  • 该函数的功能是将源内存块中的元素拷贝到目标内存块中。(参与拷贝的两个内存块需要是不重叠的)

三.函数使用示例

  • 注意该函数使用前需要引用头文件<string.h>。
#include <stdio.h>
#include <string.h>
int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1, 2, 3, 4, 5 };
	memcpy(arr1, arr2, 20);
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

在这里插入图片描述

  • 可以看到,我们将arr2数组中的元素拷贝到了arr1数组中。

四.模拟实现memcpy

#include <assert.h>
#include <stdio.h>
void* my_memcpy(void* dest, const void* src, size_t sz)		//源空间的数据并不会被改变,所以用const进行维护
{
	assert(dest && src);		//断言dest和src不是空指针
	void* ret = dest;
	while (sz--)
	{
		*(char*)dest = *(char*)src;		//拷贝一个字节
		dest = (char*)dest + 1;			//后移一个字节
		src = (char*)src + 1;			//后移一个字节
	}
	return ret;   
}
int main()
{
	int arr1[10] = { 0 };
	int arr2[] = { 1, 2, 3, 4, 5 };
	my_memcpy(arr1, arr2, 20);
	return 0;
}
  • 拷贝前

在这里插入图片描述

  • 拷贝后
    在这里插入图片描述
  • 到这里,memcpy函数的模拟实现就结束了。

memmove函数

一.函数原型

在这里插入图片描述

  • 该函数有三个参数,第一个是指向目标内存块的指针,第二个是指向源头内存块的指针,第三个是需要拷贝的字节数。
  • 函数的返回类型为void*,指向目标空间的起始位置。

二.函数功能

  • 该函数的功能是将源内存块里的数据拷贝到目标内存块中。(两个内存块可以重叠)

三.函数使用示例

  • 该函数使用时需要包含头文件<string.h>
#include <stdio.h>
#include <string.h>
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	memmove(arr + 2, arr, 20);	//目的是将1,2,3,4,5拷贝到3,4,5,6,7的位置上
	return 0;
}
  • 拷贝前,arr数组中的元素为
    在这里插入图片描述
  • 拷贝后,arr数组中的元素为
    在这里插入图片描述

四.模拟实现memmove

为了避免在拷贝时将原有的数据覆盖,因此,

  • 当dest<src时,将src从前向后拷贝
    在这里插入图片描述
  • 当dest>src时,将src从后向前拷贝
    在这里插入图片描述
#include <stdio.h>
#include <assert.h>

void* my_memmove(void* dest, void* src, size_t sz)
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		//从前向后拷贝
		while (sz--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		//从后向前拷贝
		while (sz--)
		{
			*((char*)dest + sz) = *((char*)src + sz);
		}
	}
	return ret;
}
int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	my_memmove(arr, arr + 2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
  • 这是dest<src的情况

在这里插入图片描述

  • 这是dest>src的情况
    在这里插入图片描述

注意
不重叠内存的拷贝可以使用memcpy来拷贝
重叠内存的拷贝可以使用memmove来拷贝

  • 到这里,memmove函数的模拟实现就结束了。

感谢阅读,欢迎指正!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

贝壳cc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值