memmove考虑到了字符重叠的问题,因此可能出现以下三种情况
第一种
dest与src有重叠,src>dest,这种情况只需按照平常的拷贝方式,从前往后拷贝
第二种
dest与src有重叠,src<dest,这种情况按照平常的拷贝方式,便会发生错误,当拷贝到重叠部分时,该部分的内容已经被修改过。
出现这种情况,便要从后往前拷贝
第三种
dest与src无重叠部分,从前往后,从后往前都可以(下面程序中所用的为从前往后)
程序代码如下
#include<stdio.h>
#include<assert.h>
#include<Windows.h>
const void *my_memmove(void* dest,void* src, int count)
{
assert(dest);
assert(src);
assert(count > 0);
if (((char*)dest > (char*)src) && ((char*)dest < (char*)src + count - 1))//判断是否为第二种情况
{
char *dest_end = (char*)dest + count - 1;//将指针指向dest的尾部
char *src_end = (char*)src + count - 1;//将指针指向src的尾部
while (count--)
{
*dest_end-- = *src_end--;//从后向前拷贝
}
}
else//不是第二种情况,第一种和第三种都为从前向后拷贝
{
while (count--)
{
*((char*)dest)++ = *((char*)src)++;
}
}
}
int main()
{
char arr[] = { 1, 2, 3 };
char arr1[4];
my_memmove(arr1, arr, 3);
for (int i = 0; i < 3; i++)
{
printf("%d\n", arr1[i]);
}
system("pause");
return 0;
}
注意:
在写程序时一定要将无类型的dest,src,强制转换为char类型