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。