ZeroMemory宏详解

    在使用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函数的一个特例。使用一块内存区域前对其进行清空处理可以避免内存数据的不确定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值