memcpy,memmove的实现

1.memcpy()的实现

函数原型:

char *memcpy(void * destination,const void * source,size_t num)
  • 内存拷贝函数,从source的位置开始向后拷贝num个字节的数据到dest的内存位置。
  • memcpy按字节拷贝,并不是只能拷贝字符串,所以没有‘\0’结束标志(遇到‘/0’不会停止),按指定是字节数大小拷贝
  • str家族函数只能处理字符串类型的数据,而mem可以处理任意类型的数据
  • 如果source和destination有任何重叠,复制的结果都是未定义的
void* my_memcpy(void * dest, void * src, size_t count)
{
	assert(dest);
	assert(src);
	char* p = (char *)dest;
	char* q = (char *)src;
	while (count--)
	{
		*p = *q;
		p++;
		q++;
	}
	return dest;
}

//void变量 不能被定义,因为编译器不知道它的大小,但是void*变量可以被定义出来,因为它是个指针,可以接受任意类型的指针

memcpy函数在拷贝的时候可能出现内存重叠问题,导致结果与预期的不一样。此时就可以使用memmove()解决

memcpy从前向后拷贝,本来我们想要的结果是“hello worl”,但是它的第一个h拷过去以后,之后拷贝的都是h,如果用memmove拷贝他会从后向前拷贝从而解决内存重叠问题

2.memmove()的实现 

函数原型:

voi * memmove(void * destination,const void * source,size_t num)
  • 它也是内存拷贝函数,与memcpy的差别在于他可以解决内存重叠问题
  • 如果原空间和目标空间出现重叠,就使用memmove函数处理
void* memmove(void *dest, void *src, size_t count)
{
	void * ret = dest;
	if (dest <= src || (char*)dest >= ((char*)src + count))
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		dest = (char*)dest + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

猜你喜欢

转载自blog.csdn.net/audience_fzn/article/details/81409406