一、用法
memmove用于拷贝字节,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,但复制后源内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
二、原型:
void *memmove( void* dest, const void* src, size_t count );
dest 为目标首地址,src为源头首地址,count 为字节数
三、头文件
#include<string.h>
四、功能:
由src所指内存区域复制count个字节到dest所指内存区域。
五、使用
当目标区域与源区域没有重叠则和memcpy函数功能相同,所以这里用有重叠的举例
六、模拟实现
注意:
当目标地址在源头地址的前方时,这时为了防止复制后源内容会被更改,要从后往前进行复制,
当目标地址在源头地址的后方时,这时为了防止复制后源内容会被更改,要从前往后进行复制
void* my_memmove(void* dest, const void* src, size_t n)
{
void* start = dest;
assert(dest && src);//断言
if (dest < src)
{
for (int i = 0; i < n; i++) //从前往后
{
*(char*)dest = *(char*)src;//强制类型转换,
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
for (int i = n-1; i >= 0; i--) //从后往前
{
*((char*)dest + i) = *((char*)src + i);
}
}
return start;
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr+3, arr, 20);// 5*sizeof(int)=20
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}