在使用C/C++编程时,当我们要清空一个数据的缓冲区的时候我们会执行下面的语句:
#define BUF_SIZE 64 // 缓冲区的大小.
char buf[BUF_SIZE]; // 数据的缓冲区.
ZeroMemory(buf, BUF_SIZE); // 清空数据的缓冲区.
在 Visual Studio 2017 中对ZeroMemory进行右键转到定义操作可以看到:
#define ZeroMemory RtlZeroMemory
易知,ZeroMemory 是 RtlZeroMemory 的宏替换,接着再对 RtlZeroMemory 进行右键转到定义操作,结果如下:
#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
可以看到 RtlZeroMemory(Destination,Length) 是对 memset((Destination),0,(Length)) 的宏替换。
通过上面的分析可以知道:
- 执行 ZeroMemory(buf, BUF_SIZE); 等价于执行 RtlZeroMemory(buf, BUF_SIZE);
- 执行 RtlZeroMemory(buf, BUF_SIZE); 等价于执行memset((buf),0,(BUF_SIZE))
所以要了解ZeroMemory宏只需明白:
memset((Destination),0,(Length));
对 memset 函数进行转到定义操作,结果如下:
void* __cdecl memset(
_Out_writes_bytes_all_(_Size) void* _Dst,
_In_ int _Val,
_In_ size_t _Size
);
memset 函数的解释是:
将 _Dst 所指向的某一块内存中的前 _Size 个字节的内容全部设置为 _Val 指定的ASCII值。也就是:将 _Dst 中当前位置后面的 _Size 个字节(typedef unsigned int size_t )用 _Val 替换并返回 _Dst。
其中的函数参数含义为:
- _Dst:指定的内存地址
- _Val:要填充替换的值
- _Size:要填充的字节数
注意:memset函数是以字节为单位填充的。
因此,ZeroMemory宏的作用就是将数据的缓冲区用0来填充。ZeroMemory宏其实就是memset函数的一个特例。使用一块内存区域前对其进行清空处理可以避免内存数据的不确定性。