模拟实现memmove!!

一:对memmove函数的介绍

头文件:#include <string.h>
调用形式: void * memmove ( void * destination, const void * source,size_t num);
memmove() 与 memcpy() 类似都是用来复制 source 所指的内存内容前 num 个字节到 destination 所指的地址上。不同的是,memmove() 更为灵活,当source 和 destination所指的内存区域重叠时,memmove() 仍然可以正确的处理,不过执行效率上会比使用 memcpy() 略慢些。
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处

二:原函数的调用

1.程序代码
#include<stdio.h>
#include<string.h>

int main()
{
	char arr1[32]="abcd1234efgh5678";
	char arr2[32]="abcd1234efgh5678";
	memmove(arr1+1,arr1,strlen(arr1)+1);     //strlen(arr1)+1的目的啊是将' \0' 拷贝给改变后的arr1..
	printf("arr1数组元素:%s\n",arr1);
	memmove(arr2,arr2+1,strlen(arr2)+1);     //strlen(arr2)+1的目的啊是将' \0' 拷贝给改变后的arr2.
	printf("arr2数组元素:%s\n",arr2);
	return 0;
}

2.运行结果

在这里插入图片描述

二:模拟实现memmove

1:程序代码
#include<stdio.h>
#include<string.h>      
#include<assert.h>
void *my_memmove(char* ret,const char* dst, int n)
{
	char *p=(char *)ret;
	char *q=(char *)dst;
	assert(ret);
	assert(dst);
	if(p > q && q < p+n)       //确定destination在source的右侧
	{
		q=q+n-1;
		p=p+n-1;
		while(n)
		{
			*p = *q;
			p--;
			q--;
            n--;
		}
	}
	else
	{
        while(n)
		{
			*p = *q;
			 p++,q++;
             n--;
		}
	}
	return p;

}

int main()
{
	char arr1[32]="abcd1234efgh5678";
	char arr2[32]="abcd1234efgh5678";
	my_memmove(arr1+1,arr1,strlen(arr1)+1);  //strlen(arr1)+1的目的啊是将' \0' 拷贝给改变后的arr1
	printf("arr1数组元素:%s\n",arr1);
	my_memmove(arr2,arr2+1,strlen(arr2)+1);   //strlen(arr2)+1的目的啊是将' \0' 拷贝给改变后的arr2.
	printf("arr2数组元素:%s\n",arr2);
	return 0;
}

2:运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/jack_wang128801/article/details/84491953