剖析memcpy和memmove区别

对于相同不同内存块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];
		}
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_50168448/article/details/112479741