memmove和memcpy函式的區別及實現
一、memmove()和memcpy()函式和strcpy()函式的區別;
(1)使用的型別不同,strcpy()函式只對字串進行操作;memmove()和memcpy()函式對所有型別都適用,為記憶體拷貝;
(2)strcpy()以’\0’為拷貝的結束條件;而memmove()和memcpy()函式則是以第三個引數num進行控制拷貝;
二、函式說明:
1.memcpy函式的功能是從源src所指的記憶體地址的起始位置開始拷貝N個位元組到目標dst所指的記憶體地址的起始位置中。
2.memmove函式的功能同memcpy基本一致,但是當src區域和dst記憶體區域重疊時,memcpy可能會出現錯誤,而memmove能正確進行拷貝
三、memmove()和memcpy()函式的區別和聯絡:
相同點: 兩個都是記憶體拷貝,對所有型別都適用;
不同點:
(1)memcpy()函式是從前往後拷貝;假入出現記憶體重疊的現象;拷貝結果可能出錯;
(2)memmove()函式在memcpy()函式的基礎上加入了對記憶體重疊拷貝的處理;引入了倒序拷貝的方式處理記憶體重疊的某些情況;保證拷貝的正確性;
綜上:在現實中使用memmove()函式會比較好一點;
四、各種拷貝情況:
上述三種情況,memcpy可以成功對前兩種進行拷貝,對第三種情況進行拷貝時,由於拷貝dst前兩個位元組時覆蓋了src原來的內容,所以接下來的拷貝會出現錯誤。而memmove對第三種情況進行拷貝時會從src的最後向前拷貝N個位元組,避免了覆蓋原來內容的過程。
五、模擬實現:
memcpy:
//模式實現memcpy(不會解決記憶體重疊的問題,正序拷貝,適用於任何型別)
void* MyMemcpy(void* dest,const void* src,size_t num)
{
char* dest_tmp=(char*)dest;//目標字串
const char* src_tmp=(const char*)src;//源字串
assert(dest&&src);
while(num--)
{
*dest_tmp++= *src_tmp++;
}
return dest;
}
memmove:
//模擬實現memove(會解決記憶體重疊的問題,加上了逆序拷貝,適用於任何型別)
void* MyMemmove(void* dest,const void* src,size_t num)
{
char* dest_tmp=(char*)dest;
const char* src_tmp=(const char*)src;
assert(dest&&src);
if (src_tmp>dest_tmp || src_tmp+num<=dest_tmp)//情況1和情況2
{
while(num--)//正序複製
{
*dest_tmp++=*src_tmp++;
}
}
else//情況3,逆序賦值
{
//調整指標到最後
dest_tmp+=num-1;
src_tmp+=num-1;
while(num--)
{
*dest_tmp--=*src_tmp--;
}
}
return dest;
}
相關文章
- memmove和memcpy 以及strcmp strcpy幾個庫函式的實現memcpy函式
- memcpy,memmove的實現memcpy
- strcpy,strncpy,memcpy,memmove,memset函式memcpy函式
- strcpy函式和memcpy函式的區別函式memcpy
- 實現c中memcpy函式memcpy函式
- [C練習]實現memcpy原型函式memcpy原型函式
- C語言-記憶體函式的實現(二)之memmoveC語言記憶體函式
- strcpy與memcpy的區別memcpy
- prop()函式和attr()函式的區別函式
- 函式宣告和函式表示式的區別函式
- C語言-記憶體函式的實現(一)之memcpyC語言記憶體函式memcpy
- jquery position()函式和offset()函式的區別jQuery函式
- # 普通函式和箭頭函式的區別函式
- jquery的$.each()函式和$.map()函式的區別jQuery函式
- StretchBlt函式和BitBlt函式的區別和用法函式
- python語言中類和函式的作用及區別!Python函式
- JavaScript函式宣告和函式表示式區別JavaScript函式
- JavaScript建構函式和普通函式的區別JavaScript函式
- 正規表示式match()函式和exec()函式的區別函式
- JavaScript方法和函式區別JavaScript函式
- 箭頭函式和普通函式的10個區別函式
- 面試題:箭頭函式和普通函式的區別面試題函式
- 簡述箭頭函式和普通函式的區別函式
- 定義函式的兩種形式及區別函式
- closest()函式parent()函式的區別函式
- C/C++的mem函式和strcopy函式的區別和應用C++函式
- js表示式方式和函式語句方式宣告函式的區別JS函式
- 例項物件和函式物件的區別物件函式
- Python中函式和方法的區別Python函式
- 儲存過程和函式的區別儲存過程函式
- 深入理解箭頭函式和傳統函式的區別函式
- Day 59/100 箭頭函式和普通函式的區別函式
- [C++]實現memcpyC++memcpy
- js防抖和節流的區別及實現方式JS
- Golang make和new的區別及實現原理詳解Golang
- Python中str()和repr()函式的區別Python函式
- 函式庫呼叫和系統呼叫的區別函式
- 建構函式與普通函式的區別函式