天天看点

C语言 模拟实现memmove

memmove考虑到了字符重叠的问题,因此可能出现以下三种情况

第一种

C语言 模拟实现memmove
C语言 模拟实现memmove

dest与src有重叠,src>dest,这种情况只需按照平常的拷贝方式,从前往后拷贝

第二种

C语言 模拟实现memmove
C语言 模拟实现memmove

dest与src有重叠,src<dest,这种情况按照平常的拷贝方式,便会发生错误,当拷贝到重叠部分时,该部分的内容已经被修改过。

出现这种情况,便要从后往前拷贝

第三种

C语言 模拟实现memmove
C语言 模拟实现memmove

dest与src无重叠部分,从前往后,从后往前都可以(下面程序中所用的为从前往后)

程序代码如下

#include<stdio.h>
#include<assert.h>
#include<Windows.h>

const void *my_memmove(void* dest,void* src, int count)
{
	assert(dest);
	assert(src);
	assert(count > 0);
	if (((char*)dest > (char*)src) && ((char*)dest < (char*)src + count - 1))//判断是否为第二种情况
	{
		char *dest_end = (char*)dest + count - 1;//将指针指向dest的尾部
		char *src_end = (char*)src + count - 1;//将指针指向src的尾部
		while (count--)
		{
			*dest_end-- = *src_end--;//从后向前拷贝
		}
	}
	else//不是第二种情况,第一种和第三种都为从前向后拷贝
	{
		while (count--)
		{
			*((char*)dest)++ = *((char*)src)++;
		}
	}
	
}


int main()
{
	char arr[] = { 1, 2, 3 };
	char arr1[4];
	my_memmove(arr1, arr, 3);
	for (int i = 0; i < 3; i++)
	{
	   printf("%d\n", arr1[i]);
	}
	system("pause");
	return 0;
}
           
C语言 模拟实现memmove
C语言 模拟实现memmove

注意:

在写程序时一定要将无类型的dest,src,强制转换为char类型

继续阅读