编写一个程序,memmove函数的用法和模拟实现memmove函数,——C语言(详细教程)

函数功能:

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

  • 其返回目标是void类型的指针, 指向要复制的数据源的指针,类型转换为类型为 const void 的指针。
    要复制的字节数size_t 是无符号整数类型,num是字节数

函数示例:

/* memmove example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "memmove can be very useful......";
  memmove (str+20,str+15,11);
  puts (str);
  return 0;
}

参考文献:cplusplus.com

逻辑分析

在这里插入图片描述

  • 当考虑第一种情况时,可以考虑把src前往后开始拷贝dest中,我们要思考如何在拷贝的过程中不影响地址的重叠(如果重叠的话,拷贝出的内容就不一定是我们想要的,那就没有意义了),所以这里最好的拷贝方式就是由前往后拷,这是第一种情况的实现思路。

在这里插入图片描述

  • 第二种情况和第一种情况就稍微有点不一样,如果第一种情况也像第一种情况这样向前往后拷贝到dest的话,你会发现"4 5
    6"就变成"1 2 3"了,拷贝出来的结果就是"1 2 3 1 2 3",那如果我们要拷贝的话就要把原来的数全部拷贝出来"1 2 3 4
    5 6"对吧,所以我们要改变一下思路,由后向前拷贝

在这里插入图片描述

  • 这里mommove函数的num是以字节为单位,这里是整形单位,每个字符占4个字节。

代码展示

void* my_memmove(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	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 dest;
}


//编写一个代码,把memmove代码模拟实现
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(arr, arr + 3, 6 * sizeof(int));
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值