memmove函数的介绍
结构:
void * memmove ( void * destination, const void * source, size_t num );
头 文 件:#include <string.h>
函数功能:移动内存块
返回值:返回目的地地址
说明:
1、它可以将源内存块中的数据复制到目标内存块中,同时保证在源内存块和目标内存块重叠的情况下也能正确地进行复制。
2、该函数不检查源中的任何终止 null 字符 - 它始终准确复制 num 个字节。
3、为避免溢出,目标参数和源参数所指向的数组的大小应至少为 num 个字节。
memmove函数的模拟实现方法
#include<stdio.h>
#include<string.h>
#include<assert.h>
//指向要复制内容的目标数组的指针,指向要复制的数据源的指针,要复制的字节数
void* My_memmove(void* dest, const void* src, size_t num)
{
void* ret = dest; //记录首地址,便于之后寻找
assert(dest && src); //保证指针的有效性
if (dest < src) //如果目标数组的指针小于数据源的指针
{
while (num--) //从前向后
{
*(char*)dest = *(char*)src; //强制转换成char*,再解引用,然后赋值
//强制转换成char*,再+1个字节,也就是目的地址+1
dest = (char*)dest + 1;
//强制转换成char*,再+1个字节,也就是源地址+1
src = (char*)src + 1;
}
}
else
{
while (num--) //从后向前
{
/*当num为20时,先进行num--操作,变成19,
然后dest和src强制转换成char*,再+19。
就是从要复制的最后一个字节开始复制,每次num--,地址-1,
地址-1,也就向前走了,直到num为0*/
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
My_memmove(arr+2, arr, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]); //1 2 1 2 3 4 5 8 9 10
}
return 0;
}
当二者完全重叠时,从前往后,从后往前都一样