ZeroMemory 與 memset

ZeroMemory  

   ZeroMemory() ZeroMemory宏用0來填充一塊內存區域。 

  爲了避免優化編譯器的意外的影響,請使用SecureZeroMemory函數。 
  void ZeroMemory( 
  PVOID Destination, 
  SIZE_T Length 
  ); 
  參數: 
  Destination :指向一塊準備用0來填充的內存區域的開始地址。 
  Length :準備用0來填充的內存區域的大小,按字節來計算。 
  返回值:無 
  ZeroMemory 只是將指定的內存塊清零. 
  使用結構前清零, 而不讓結構的成員數值具有不確定性, 是一個好的編程習慣 
  備註: 
  這個函數被定義爲RtlZeroMemory宏。至於更多信息,請查看Winbase.h與Winnt.h這兩個頭文件。

ZeroMemory和memset的聯繫和區別:

       ZeroMemory用0來填充一塊內存區域,原型爲: 
  void ZeroMemory([in] PVOID Destination,[in] SIZE_T Length); 
  函數memset, wmemset或者memset給字符串設置緩衝,原型爲: 
  void memset( void *dest, int c, size_t count ); 
  wchar_t memset(wchar_t *dest,wchar_t c,size_t count); 
  翻看SDK,找到頭文件宏ZeroMemory的定義4 x; 
  #define ZeroMemory RtlZeroMemory 
  #define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length)) 
  從上可以看出ZeroMemory是調用memset來實現的。 
  Raymond Chen在文章中寫道,用ZeroMemory比“= {0}” 這樣的語法更清晰,而且用後者不是所有人可以馬上明白。 
  Richard Stevens在《UNIX網絡編程》中寫道,memset有個潛在的危險,它的後兩個參數類型相同,但是含義大徑庭,   如果不慎寫反了編譯時也不容易查出來;相比起源於Berkerly網絡編程代碼早期的bezro不是ANSIC函數,但它的兩個參數更容易記憶。 
  爲什麼Microsoft code sample傾向使用ZeroMemory而不是{0}? 中寫道,在windows平臺下,對於數組或純結構使用ZeroMemory是安全的,對於類,則使用構造函數,不要調用ZeroMemory。 
  如果要調用ZeroMemory,則只是需要加入 
  #define _M_AXP64 //在頭文件裏定義該宏 
  #include <windows.h> 
  ZeroMemory與memset區別 
  ZeroMemory是微軟的SDK提供的,memset屬於C Run-time Library,所以ZeroMemory只能用於Windows系統,memset可用於別的系統。 
  ZeroMemory是一個宏,只是用於把一段內存的內容置零,內部是用memset實現的,memset可將內存置成別的字符。 
  如果你的程序是Win32程序而且不想連接c運行時庫,那就用ZeroMemory,如果需要跨平臺,那就用memset。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章