C语言复习---模拟实现memmove,memcpy

之前复习时模拟实现了关于字符串的一些操作,今天在之前的基础上完成memmove,memcpy两个对内存进行操作的函数

这是两个函数的原型:

void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);

两个函数都实现的是拷贝一定长度的内存的内容;

但是区别是当发生内存重叠的情况时,memmove可以保证拷贝的完整安全性,而memcpy不能保证拷贝结果的正确性。

因此我们只要在memcpy的代码上加上对内存重叠的处理就可以得到memmove

内存重叠的情况有两种,我们在这里进行简单的介绍:

情况一:

情况二:

由于第二种情况中使用memecpy拷贝的话就会因为内存重叠造成源字符串发生改变,因此我们要针对第二种情况下对memcpy进行优化。

void* my_memcpy(void* dest,const void* src, size_t count)
{
	char* temp1 = (char*) dest;
	char* temp2 = (char*) src;
	while (count--)
	{
		*temp1++ = *temp2++;
	}
	return dest;
}

而在第二种情况下为了避免出现内存重叠,我们就要考虑为确保安全要加上限制条件:

1.dest > src     2.   重新定位dest和src的位置     3.分情况处理

void* my_memmove(void* dest,const void* src, size_t count)
{
	char* temp1 = (char*) dest;
	char* temp2 = (char*) src;
	if (dest > src && ((src + count) > dest))
	{
		temp1 = temp1 + count - 1;
		temp2 = temp2 + count - 1;
		while (count--)
		{
			*temp1-- = *temp2--;
		}
	}
	else
	{
		while (count--)
		{
			*temp1++ = *temp2++;
		}
	}
	return dest;
}

猜你喜欢

转载自blog.csdn.net/Shile975/article/details/88553562