程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C/C++ memmove與memcpy的區別及實現,memmovememcpy

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

編輯:關於C語言

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


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

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

2.函數說明:        

3.拷貝情況:

      拷貝的具體過程根據dst內存區域和src內存區域可分為三種情況:

      1.當src內存區域和dst內存區域完全不重疊


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


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

 

     上述三種情況,memcpy可以成功對前兩種進行拷貝,對第三種情況進行拷貝時,由於拷貝dst前兩個字節時覆蓋了src原來的內容,所以接下來的拷貝會出現錯誤。而memmove對第三種情況進行拷貝時會從src的最後向前拷貝N個字節,避免了覆蓋原來內容的過程。

4.代碼實現

memcpy:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved