飞道的博客

模拟实现memmove

310人阅读  评论(0)

函数原型
void *memmove( void *dest, const void *src, size_t count );

头文件
<string.h>

功能
memmove函数从src(源内存地址起始位置)拷贝count个字节到des(目的地内存地址的起始位置)

使用须知
memmove函数不仅可以完成memcpy函数的所包含功能,还可以完成重叠内存区域的拷贝任务。

实现思路
先找出des与src的位置关系,完之后分别实现代码。图解如下(小端存储器下)
des > src(从前往后拷贝字符)

des < src(从前往后行不通,1拷贝到3,那么3的位置就不在是3了而是1,换思路从后往前)

(src + 19 拷贝到des + 19)(再拷贝到+18,+17,…,+1)(逐字节偏移)

实现memmove代码

#include<stdio.h>
#include<assert.h>
void* My_memmove(void* des, const void* src, size_t count)
{
   
	assert(des && src);//断言编程好习惯!!!
	void* ret = des;
	//从后往前
	if (src < des)
	{
   
		while (count--)//num此步已经完成自减1的操作,
		{
   
			//(src + 19 拷贝到des + 19)(再拷贝到+18,+17,...,+1)
			//(逐字节偏移)
			*((char*)des + count) = *((char*)src + count);
		}
	}
	//从前往后
	else
	{
   
		while (count--)
		{
   
			*(char*)des = *(char*)src;
			++(char*)des;
			++(char*)src;
		}
	}
	return ret;
}
int main()
{
   
	int i;
	int arr1[] = {
    1,2,3,4,5,6,7,8,9,10 };
	My_memmove(arr1, arr1 + 2, 5 * sizeof(int));
	for (i = 0; i < 10; i++)
	{
   
		printf("%d ", arr1[i]);
	}
	return 0;
}

若对你有帮助,别忘了分享收藏 哦!Good Day!!!


转载:https://blog.csdn.net/MerryMaking7946/article/details/114899412
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场