0

我在 msdn 上看这个例子:

http://msdn.microsoft.com/en-us/library/ms894209.aspx

DWORD dwResult;

MEMORY_BASIC_INFORMATION mbiMemory;

// Clear the results structure.
memset (&mbiMemory, 0, sizeof(MEMORY_BASIC_INFORMATION));

dwResult = VirtualQuery (lpPage,        // Page to examine
                     &mbiMemory,    // Structure for results
                     sizeof(MEMORY_BASIC_INFORMATION));

if (sizeof(MEMORY_BASIC_INFORMATION) != dwResult)
{

    // Your error-handling code goes here.

}

似乎他们使用 memset 作为向 mbiMemory 分配内存的一种方式。可以吗?我不会这样跑过一些内存吗?谢谢!

4

4 回答 4

8

不,它们不分配内存,它们只是将结构重置为包含全零,以便将其初始化为某个已知状态并且程序以可重现的方式运行。由于它们只覆盖该结构(sizeof作为“字节数”传递),它们不会超出任何内容。

于 2011-05-19T11:02:14.400 回答
6

惯用编码是这样的:

MEMORY_BASIC_INFORMATION mbiMemory = {0};

问题在于,当非专业 C++ 程序员阅读示例时,他们很可能不会理解该特定语法。Raymond Chen最近在 2005 年写过这篇文章。

于 2011-05-19T11:06:04.750 回答
0

No.INFORMATION mbiMemory是一个自动变量。它是一个结构,它被分配在堆栈上。就像你写的一样int foo

于 2011-05-19T11:02:15.977 回答
0

通过以下方式在堆栈上分配内存:

MEMORY_BASIC_INFORMATION mbiMemory;

memset 正在清除已分配为零的内存。

于 2011-05-19T11:02:32.990 回答