1.與字符串函數strcpy區別:
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