memcpy和memmove都是C语言中的库函数,在头文件string.h中,作用都是内存拷贝,但是memcpy的功能要小于memmove,mommove可以保证重叠拷贝时的正确性。
如图 ,memcpy(arr+2,arr,16) 会输出12121212789,拷贝时前边会把后面覆盖掉,memmove就能解决这个问题 ,分情况处理 ,如果 dst 大于 src就要从后往前拷贝,其他从前往后拷贝
附memmove的实现
#include<stdio.h>
#include<assert.h>
void* my_memmove(void* dst, const void* src, size_t count)
{
void* d = dst;
assert(dst != NULL);
assert(src != NULL);
if(dst <= src || (char*)dst >= ((char*)src + count))
{
while (count--)
{
*(char*)dst = *(char*)src;
((char*)dst)++;
((char*)src)++;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dst = *(char*)src;
((char*)dst)--;
((char*)src)--;
}
}
return d;
}
int main()
{
char arr[20] = { "123456789" };
char* ret = my_memmove(arr , arr+2, 4);
printf("%s", ret);
system("pause");
return 0;
}