一、用法
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)=20for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}