C 的Memcpy與Memcpy s函式解析

2021-09-28 12:26:32 字數 2079 閱讀 6343

一. 函式內容

** 1.1函式原型 **

void * memcpy(void * dest,const void * src,size_t count)這是乙個函式指標 接收的是乙個位址 dest是接收位址的首位址,src是源首位址,count是接收目標的大小單位為位元組 位於cstring或memcpy.h標頭檔案中。

windows中memcpy的函式原型  

void* __cdecl memcpy(void* dst,const void* src,size_t count)

while(count--)

return (ret);

}

改進之後的memcpy

void *my_memcpy_byte(void *dst, const void *src, int n)

else

return dst;

}

linux版本

void *memcpy(void *to, const void *from, size_t n)

if (n > 2 && (long)to & 2)

temp = n >> 2;

if (temp)

if (n & 2)

if (n & 1)

return xto;

}

#include#includeint main(void)

##輸出為

destination before memcpy:abcdefghijlkmnopqrstuvwxyz0123as6

destination after memcpy: ******************************as6

void *dest,

size_t numberofelements,

const void *src,

size_t count

);

以下是檢視其他資料收集出來的

~~ 第乙個引數為目標記憶體位址,第二個引數為目標記憶體緩衝大小,第三個引數為源記憶體位址,第四個為源記憶體緩衝的大小。返回值是乙個錯誤碼。

為什麼這個返回值是錯誤碼呢?因為這個版本中加入了基本的錯誤檢測。如果源緩衝大小為0,即count為0,函式返回0,什麼也不做。此函式沒有對目標指標為null的情況,不做檢查,所以你自己要注意檢查。如果指標有值,但是是無效值,函式也沒辦法檢查是否是有效記憶體,只是會蒐集這些資訊,在程式崩潰時提供除錯需要的資訊。

然後檢查源位址是否為空或count是否大於sizeinbytes,兩個條件有乙個滿足,函式中先將目標記憶體以sizeinbytes指定的大小呼叫memset函式清0.這裡可以看出,如果sizeinbytes傳入的大小超出目標緩衝區的大小,也是會帶來隱患的,一旦清除了其他程序的或者其他執行緒的記憶體,都是帶來問題,也很可能導致記憶體操作違規。所以,第二個引數的大小不能超過目標緩衝的大小,以位元組為單位。然後程式蒐集錯誤資訊,最後返回錯誤碼,並不會執行記憶體複製的過程。前面說的這是兩個條件任意乙個進入都會導致失敗,所以在蒐集資訊時,程式會對進入的條件進行判斷,然後進行蒐集。

只有這些檢查通過,才會呼叫memcpy函式執行記憶體複製過程。而第二個引數只是內部用來檢測和清除目標記憶體而使用的。

函式memcpy_s執行完畢後返回0,所以檢查返回值是否為0不能判斷是否成功。但是返回值為非零那就是失敗了。

雖然說加上_s版本的函式是安全版本,但是也是會出現問題的,使用時也要注意,即使有時候不崩潰,但是一旦改寫了其他的執行緒的記憶體,必然導致程式執行不正常,因為執行緒的資料被破壞,至少邏輯會出錯。

不過,_s版本函式提供了一定的檢測,並且在release版本也可以報錯,可以進一步除錯問題,而memcpy則在release版本中不會報錯 ~~

--

函式 memcpy_s( void *dest, size_t numberofelements, const void *src, size_t count ),

先申請了乙個緩衝區大小,為numberofelements,當count超過這個緩衝區的時候就開始溢位

memcpy與直接賦值

memcpy會執行資料複製,而賦值語句只是簡單將乙個指標的值傳給另乙個指標,指標對應的儲存空間的內容並不會改變 操作一般不會分配記憶體 在宣告初始化時會分配 memcpy 函式的字面意思就是記憶體拷貝,把一塊記憶體中的資料拷貝給另一塊記憶體,這個過程中有新的記憶體分配了。memcpy從名字上也可以理...

strcpy與memcpy的區別。

strcpy與memcpy的區別。考點 字串複製與記憶體複製之間的區別。出現頻率 解析strcpy和memcpy主要有以下3方面的區別。複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列 整型 結構體 類等。複製的方法不同。strcpy不需要指定長度,它遇到字串結...

strcpy 與 memcpy的區別

strcpy和memcpy都是標準c庫函式,它們有下面的特點。strcpy提供了字串的複製。即strcpy只用於字串複製,並且它不僅複製字串內容之外,還會複製字串的結束符。已知strcpy函式的原型是 char strcpy char dest,const char src memcpy提供了一般記...