memmove的作用是移动内存块
将字节数的值从源指向的位置复制到目标指向的内存块。复制就像使用了中间缓冲区一样,允许目标和源重叠。而memcpy在标准规定中不硬性要求拷贝的空间存在重叠。
以下是函数的声明
void * memmove ( void * destination, const void * source, size_t num );
1.函数的参数及其返回值
1.1参数
目的地(destina)
指向要在其中复制内容的目标数组的指针,类型转换为 void* 类型的指针。
源(source)
指向要复制的数据源的指针,类型转换为 const void* 类型的指针。
无符号整形(size_t)
要复制的字节数。
1.2返回值
目标首地址,类型为void *
2.应用方式与memcpy类似
int arr[10]={ 1,2,3,4,5,6,7 };
memmove(arr + 4, arr, 20);
for (int i = 0; i < 15; i++)
{
printf("%d\n", arr[i]);
}
3.模拟实现
与之前memcpy不同,memmove可以作用于重叠的内存区域。
通过观察我们可以发现des若是落在source之前时采用从前向后的拷贝方式
落在source之前且source所指向的空间内应当采用从后向前
至于落在最后面则是两者均可,为了划分的方便则此处也采用从后向前
void* my_memmove(void* des, void const* source, size_t num)
{
assert(des && source);
void* ret = des;
if (des <= source)
{
for (int i = 0; i < num; i++)
{
*((char*)des + i) = *((char*)source + i);
}
}
else
{
while (num--)
{
*((char*)des + num) = *((char*)source + num);
}
return ret;
}
}