memcpy 和 memmove 函数

memcpy 和 memmove 都是C语言提供的内存拷贝函数。

memcpy的函数实现

linux 实现版本
#include <assert.h>  // assert 需要的头文件
void* memcpy(void * dest, void *src, size_t count)
{
	assert(src != NULL && src != NULL);
	char *tmp = (char *)dest;
	const char* s = (const char*)src;
	for (size_t i = 0; i < count; i++)
	{
		tmp[i] = s[i];
	}
	return dest;
}
 
 
<pre name="code" class="cpp">void* memcpy(void * dest, void *src, size_t count)
{
	void *ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;
}


 该函数有极大缺陷,如内存重复的问题等。 
 

memmove就是一个比较好的选择

void* memmove(void *dest, const 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);
}

当src和dest区域没有重叠时,两个函数是完全一样的。木有重叠的条件是: dst <= src || (char *)dst >= ((char *)src + count 。否则,memcpy是不能正常工作的,memmove是可以正常工作的。


猜你喜欢

转载自blog.csdn.net/dabenxiong_1/article/details/47844095
今日推荐