模拟实现库函数memmove 和memcpy以及它们的区别

函数作用及差别

memcpy

void * memcpy( void * destination, const void * source ,size_t num);

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到’\0’的时候并不会停下来
3.如果source和destination有任何的重叠,复制的结果都是未定义的

memmove

void * memmove( void * destination, const void * source ,size_t num);

和memcpy的作用是一样的

唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确

在这里插入图片描述
在这里插入图片描述
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节的原来的内容首先就被覆盖了,而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容,显然这是有问题的。
实际上,memcpy只是memmove的一个子集。

memcpy的模拟实现

void* my_memcpy(void* dst, const void* src, int num)
{
    
    
	assert(dst);
	assert(src);
	char* _dst = (char*)dst;
	const char* _src = (char*)src;
	//left->right
	while (num) {
    
    
		*_dst = *_src;/从左往右拷贝
		_dst++;
		_src++;
		num--;
	}
	return dst;
}

memmove的模拟实现

void* my_memmove(void* dst, const void* src, int num)
{
    
    
	assert(dst);
	assert(src);
	char* _dst = (char*)dst;
	const char* _src = (char*)src;
	if (_dst > _src && _dst < _src + num) {
    
    
		// right->left拷贝
		_dst = _dst + num - 1;
		_src = _src + num - 1;
		while (num) {
    
    
			*_dst = *_src;
			_dst--;
			_src--;
			num--;
		}
	}
	else {
    
    
		//left->right拷贝
		while (num) {
    
    
			*_dst = *_src;
			_dst++;
			_src++;
			num--;
		}
	}
	return dst;
}

猜你喜欢

转载自blog.csdn.net/weixin_50843868/article/details/109910025