【memmove函数的功能介绍及模拟实现】

memmove函数的功能介绍及模拟实现✍️

1.memmove函数的功能介绍

1.1函数结构️

void * memmove ( void * destination, const void * source, size_t num );

1.2 功能介绍

根据cplusplus网站上对memmove函数的介绍:
【memmove函数的功能介绍及模拟实现】_第1张图片

它的功能就是:
将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样,允许目标和源重叠。
源指针和目标指针指向的对象的基础类型与此函数无关;结果是数据的二进制副本。
该函数不检查源中的任何终止空字符 - 它总是准确地复制字节数。
为避免溢出,目标参数和源参数指向的数组的大小应至少为字节数。

简洁的大白话就是:移动内存块!!!

函数结构分析️

void * memmove ( void * destination, const void * source, size_t num );

根据它的结构代码,可以分析出:
1.首先,它是针对内存块的,它需要返回内存,所以是void类型,又因为内存里存放的数据类型可以有很多不同种的,所以就用void来接收,后面再针对不同的类型进行强制类型转换。
2.其次,就是它的前两个所接受的数据类型,都是内存块,所以都指针,由于数据多样化需要用void*来接收,它的第三个接收的数据是需要移动的内存的大小,单位是字节,所以用size_t来接收

2.memmove函数应用

2.1代码实现✍️

#include
#include
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr, arr + 2, 20);
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

2.2运行结果展示

【memmove函数的功能介绍及模拟实现】_第2张图片

3.memmove函数与memcpy函数的对比

3.1根据cplusplus网站介绍

1.memcpy函数
【memmove函数的功能介绍及模拟实现】_第3张图片

其作用:拷贝不重叠的内存块

2.memmove函数
【memmove函数的功能介绍及模拟实现】_第4张图片
• 和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
• 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。

4.memmove函数的模拟实现✍️

4.1模拟图解分析

分析模拟memmove函数
分类讨论
1.dest的地址小于src的地址
2.dest的地址和src的地址重叠
3.dest的地址大于src的地址

**1.**三种分类
【memmove函数的功能介绍及模拟实现】_第5张图片

**2.**两种移动方法
【memmove函数的功能介绍及模拟实现】_第6张图片

**3.**两种方法的代码简化实现
【memmove函数的功能介绍及模拟实现】_第7张图片

4.2代码实现✍️

4.2.1 方法1✍️

//模拟实现memmove函数
#include
#include
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);//防止空指针
	//从前向后
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
		
	}
	//从后向前
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}
int main()
{
	int arr[10] = { 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;
}

4.2.2 方法2✍️

//模拟实现memmove函数
#include
void* my_memmove(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest && src);
	//从后向前
	if (dest>=src&&dest<=(char*)src+num)
	{
		while (num--)
		{
		*((char*)dest + num) = *((char*)src + num);
		}
		
	}
	//从前向后
	else
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	return ret;
}
int main()
{
	int arr[10] = { 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;
}

你可能感兴趣的:(C语言,#,函数,#指针,c语言,算法,库函数的模拟实现)