对于相同不同内存块memcpy和memmove都能实现内存拷贝,对于相同内存块memmove仍然可以实现内存拷贝,但是memcpy可能就实现不了了。主要原因就是memcpy只是进行从头到尾的拷贝而memmove可根据不同情况可能是从头到尾的拷贝也可能是从尾到头的拷贝
不同内存块
内存重叠(相同内存块)
可以看到这样的重叠方式中字符串src = “ello”,dst = “hello”
拷贝后dst = “ello”,也可以正常拷贝。
如果是这样的重叠方式,memcpy因为是从头到尾的拷贝拷贝的过程也会不断覆盖,导致拷贝不成功。而在这种情况下memmove采取的是从尾到头拷贝可以拷贝成功。
分享我写的memcpy和memmove帮助大家理解
MyMemcpy
void MyMemcpy(void *_dst, const void *_src, int size)
{
char *dst = (char*)_dst;
char *src = (char*)_src;//因为是内存拷贝因为强制类型转换尾char这样解引用后就可以逐个字节拷贝
while (size--)//size是src的字节数量
{
*dst = *src;
dst++;
src++;
}
}
MyMemmove
void MyMemmove(void *_dst, const void *_src, int size)
{
char *dst = (char*)_dst;
char *src = (char*)_src;
if (dst > src && dst < src+size)//满足内存上述的第二种内存重叠时采用从尾到头的拷贝方式
{
for (int i = size-1; i >= 0;--i)
{
dst[i] = src[i];
}
}
else//正常情况下采用从头到尾拷贝
{
for (int i = 0; i < size; i++)
{
dst[i] = src[i];
}
}
}