memcpy和memmove記憶體重疊問題解析

2021-08-18 06:36:07 字數 3992 閱讀 2547

區別:memcpy和memmove()都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下:

[cpp]

view plain

copy

print?

void

*memcpy(

void

*dst, 

const

void

*src, 

size_t

count);  

void

*memmove(

void

*dst, 

const

void

*src, 

size_t

count);  

他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。

一、memcpy函式

memcpy原型:

[cpp]

view plain

copy

print?

void

*memcpy(

void

*dest, 

const

void

*src, 

size_t

n);  

描述:memcpy()函式從src記憶體中拷貝n個位元組到dest記憶體區域,但是源和目的的記憶體區域不能重疊。

返回值:

memcpy()函式返回指向dest的指標。

二、memmove函式

memmovey原型:

[cpp]

view plain

copy

print?

void

*memmove(

void

*dest, 

const

void

*src, 

size_t

n);  

描述:memmove() 

函式從src記憶體中拷貝n個位元組到dest記憶體區域,但是源和目的的記憶體可以重疊。

返回值:

memmove函式返回乙個指向dest的指標。

從上面的描述中可以看出兩者的唯一區別就是在對待重疊區域的時候,memmove可以正確的完成對應的拷貝,而memcpy不能。

記憶體覆蓋的情形有以下兩種,

先看memcpy()和memmove()這兩個函式的實現:

[cpp]

view plain

copy

print?

void

* my_memcpy(

void

* dst, 

const

void

* src, 

size_t

n)  

return

dst;  

}  從實現中可以看出memcpy()是從記憶體左側乙個位元組乙個位元組地將src中的內容拷貝到dest的記憶體中,這種實現方式導致了對於圖中第二種記憶體重疊情形下,最後兩個位元組的拷貝值明顯不是原先的值了,新的值是變成了src的最開始的2個位元組了。

而對於第一種記憶體覆蓋情況,memcpy的這種拷貝方式是可以的。

而memmove就是針對第二種記憶體覆蓋情形,對memcpy進行了改進,改進**如下:

[cpp]

view plain

copy

print?

void

* my_memmove(

void

* dst, 

const

void

* src, 

size_t

n)  

}else

}  return

dst;  

}  區別:

memcpy和memmove()都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下:

[cpp]view plain

copy

print?

void

*memcpy(

void

*dst, 

const

void

*src, 

size_t

count);  

void

*memmove(

void

*dst, 

const

void

*src, 

size_t

count);  

他們的作用是一樣的,唯一的區別是,當記憶體發生區域性重疊的時候,memmove保證拷貝的結果是正確的,memcpy不保證拷貝的結果的正確。

一、memcpy函式

memcpy原型:

[cpp]view plain

copy

print?

void

*memcpy(

void

*dest, 

const

void

*src, 

size_t

n);  

描述:memcpy()函式從src記憶體中拷貝n個位元組到dest記憶體區域,但是源和目的的記憶體區域不能重疊。

返回值:

memcpy()函式返回指向dest的指標。

二、memmove函式

memmovey原型:

[cpp]view plain

copy

print?

void

*memmove(

void

*dest, 

const

void

*src, 

size_t

n);  

描述:memmove() 

函式從src記憶體中拷貝n個位元組到dest記憶體區域,但是源和目的的記憶體可以重疊。

返回值:

memmove函式返回乙個指向dest的指標。

從上面的描述中可以看出兩者的唯一區別就是在對待重疊區域的時候,memmove可以正確的完成對應的拷貝,而memcpy不能。

記憶體覆蓋的情形有以下兩種,

先看memcpy()和memmove()這兩個函式的實現:

[cpp]view plain

copy

print?

void

* my_memcpy(

void

* dst, 

const

void

* src, 

size_t

n)  

return

dst;  

}  

從實現中可以看出memcpy()是從記憶體左側乙個位元組乙個位元組地將src中的內容拷貝到dest的記憶體中,這種實現方式導致了對於圖中第二種記憶體重疊情形下,最後兩個位元組的拷貝值明顯不是原先的值了,新的值是變成了src的最開始的2個位元組了。

而對於第一種記憶體覆蓋情況,memcpy的這種拷貝方式是可以的。

而memmove就是針對第二種記憶體覆蓋情形,對memcpy進行了改進,改進**如下:

[cpp]view plain

copy

print?

void

* my_memmove(

void

* dst, 

const

void

* src, 

size_t

n)  

}else

}  return

dst;  

}  

memmove 和 memcpy的區別

memcpy和memmove 都是c語言中的庫函式,在標頭檔案string.h中,作用是拷貝一定長度的記憶體的內容,原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void src...

memcpy和memmove的區別

memcpy和memmove的區別 memcpy 和memmove 都是c語言中的庫函式,在標頭檔案string.h中,其原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void ...

memcpy和memmove的區別

memcpy和memmove的區別 memcpy 和memmove 都是c語言中的庫函式,在標頭檔案string.h中,其原型分別如下 void memcpy void dst,const void src,size t count void memmove void dst,const void ...