memset используется для выделения памяти? - PullRequest
0 голосов
/ 19 мая 2011

Я смотрел на этот пример на 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 ]

6 голосов
/ 19 мая 2011

Идиоматическое кодирование будет выглядеть следующим образом:

MEMORY_BASIC_INFORMATION mbiMemory = {0};

Проблема в том, что когда неопытные программисты C ++ читают примеры, они, скорее всего, не поймут этот конкретный синтаксис.Раймонд Чен недавно написал об этом в 2005 году.

6 голосов
/ 19 мая 2011

Нет, они не выделяют память, они просто сбрасывают структуру, чтобы она содержала все нули, чтобы она инициализировалась до некоторого известного состояния, и программа ведет себя воспроизводимым образом. Так как они перезаписывают только эту структуру (sizeof передается как «число байтов»), они ничего не переполняют.

0 голосов
/ 19 мая 2011

Память выделяется в стеке следующим образом:

MEMORY_BASIC_INFORMATION mbiMemory;

memset очищает память, выделенную для нулей.

0 голосов
/ 19 мая 2011

Нет.INFORMATION mbiMemory является автоматической переменной .Это структура, и она расположена в стеке.Как если бы вы написали int foo.

...