一. 函式內容
** 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提供了一般記...