内存函数-----Memmove函数

发布于:2022-11-03 ⋅ 阅读:(494) ⋅ 点赞:(0)

memmove函数

头文件:<string.h>

函数功能:将从源地址source开始的num个字节移动至目标地址destination处【可用于源地址与目标地址内存重叠的情况】

函数参数以及返回类型:void* memmove(void* destination, const void* source, size_t num)

参数解释:

1.因为不知道要移动的参数是什么类型,所以源地址source的指针类型设定为无类型指针;

2.用const来保护源地址处的数据,防止被篡改;

3.函数的返回类型是目标地址的指针类型,定义为无类型指针;

函数使用:

源数据数组:arr[10]={1,2,3,4,5,6,7,8,9,10}

将数组中的第1-4个位置的元素复制移动到数组对的第2-5元素的位置

目标数据数组:arr[10]={1,1,2,3,4,5,7,8,9,10}

代码实现:


#include <stdio.h>
#include <string.h>
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

	memmove(arr+1, arr, 20);

	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}

	return 0;
}

代码实现memmove函数的功能:

#include <stdio.h>
#include <assert.h>
#include <string.h>
void* my_memmove(void* dest, const void* sour, size_t num)
{
	void* temp = dest;
	assert(dest && sour);
	char* dest1 = (char*)dest;
	char* sour1 = (char*)sour;
	//判断源地址和目标地址的大小,决定是倒序复制还是正序复制
	if (dest1 > sour1)
	{
		//倒序复制
		while (num--)
		{
			*(dest1 + num) = *(sour1 + num);
		}
	}
	else if (dest1 < sour1)
	{
		//正序复制
		while (num--)
		{
			*(dest1) = *(sour1);
			dest1++;
			sour1++;
		}
	}
	return temp;

}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };


	memmove(arr+1, arr, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

注意事项:

1.将源地址和目标地址的指针转化为字符指针类型,确保+1时,步长为1,跳过1个字节

2.判断源地址source和目标地址destination的相对大小,进而选择正序或者逆序的方式赋值:当源地址source大于目标地址destination时,为了防止源地址起始处的数据被覆盖,应选择正序赋值,也就是先从源数据的首端开始赋值,反之,相反。

3.源地址加num-1个字节时,指向的是最后一个数据,while(n--)中拿n判断,拿n-1使用;

特别鸣谢:哔哩哔哩比特鹏哥的视频教程

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到