一:对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;
}