1.與字符串函數strcpy區別:
- memcpy與memmove都是對內存進行拷貝可以拷貝任何內容,而strcpy僅是對字符串進行操作。
- memcpy與memmove拷貝多少是通過其第三個參數進行控制而strcpy是當拷貝至'\0'停止。
2.函數說明:
- memcpy函數的功能是從源src所指的內存地址的起始位置開始拷貝N個字節到目標dst所指的內存地址的起始位置中。
- memmove函數的功能同memcpy基本一致,但是當src區域和dst內存區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝。
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
