C/C++ memmove與memcpy的區別及實現

1.與字符串函數strcpy區別:
c++

  • memcpy與memmove都是對內存進行拷貝能夠拷貝任何內容,而strcpy僅是對字符串進行操做。
  • memcpy與memmove拷貝多少是經過其第三個參數進行控制而strcpy是當拷貝至'\0'中止。

2.函數說明:        
函數

  1. memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝N個字節到目標dst所指的內存地址的起始位置中。
  2. memmove函數的功能同memcpy基本一致,可是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝。

3.拷貝狀況:spa

      拷貝的具體過程根據dst內存區域和src內存區域可分爲三種狀況:
.net

      1.當src內存區域和dst內存區域徹底不重疊指針


     2.當src內存區域和dest內存區域重疊時且dst所在區域在src所在區域前code


     3.當src內存區域和dst內存區域重疊時且src所在區域在dst所在區域前blog

 

     上述三種狀況,memcpy能夠成功對前兩種進行拷貝,對第三種狀況進行拷貝時,因爲拷貝dst前兩個字節時覆蓋了src原來的內容,因此接下來的拷貝會出現錯誤。而memmove對第三種狀況進行拷貝時會從src的最後向前拷貝N個字節,避免了覆蓋原來內容的過程。
內存

4.代碼實現字符串

memcpy:class

void* _memcpy(void* dest, const void* src, size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判斷dest指針和src指針是否爲空,若爲空拋出異常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;
	//將指針dest和指針src由void強轉爲char,
	//使得每次均是對內存中的一個字節進行拷貝
	while (count--)
		*tmp_dest++ = *tmp_src++;
	return dest;
}

memmove:

void* _memmove(void* dest, const void* src, size_t count)
{
	assert(src != nullptr&&dest != nullptr);
	//判斷dest指針和src指針是否爲空,若爲空拋出異常
	char* tmp_dest = (char*)dest;
	const char* tmp_src = (const char*)src;

	if (tmp_src < tmp_dest)//當src地址小於dest地址時,從頭進行拷貝
		while (count--)
			*tmp_dest++ = *tmp_src++;
	else if (tmp_src > tmp_dest)//當src地址大於dest地址時,從後進行拷貝
	{
		tmp_src += count - 1;
		tmp_dest += count - 1;
		while (count--)
			*tmp_dest-- = *tmp_src;
	}
	//else(tmp_src==tmp_dest) 此時不進行任何操做
	return dest;
}


若有錯誤請指出,謝謝

 CSDN地址:http://blog.csdn.net/lyl_312/article/details/51419822

相關文章
相關標籤/搜索