Что такое тип данных PVOID? - PullRequest
14 голосов
/ 30 января 2009

Может кто-нибудь объяснить, что такое PVOID и как оно используется в такой функции, как:

BOOL DoSomething(PVOID pMemPhy)

Ответы [ 6 ]

21 голосов
/ 30 января 2009

пустой указатель, такой же как

void *pMemPhy

aka «Указатель на что-то, но вы сами должны это выяснить».

BOOL DoSomething ( PVOID pMemPhy )
{
    strcpy((char *)pMemPhy, "I love buffer overflows!");
    return TRUE;
}
12 голосов
/ 30 января 2009

Это пустой указатель - указатель на адрес памяти без информации о типе значения, на которое он указывает. По этой причине перед использованием указателя необходимо привести указатель к типу, например (char *)pMemPhy или (int *)pMemPhy, чтобы компилятор знал, сколько памяти он использует (1 байт для символа, 4 байта для целого и т. Д. .)

4 голосов
/ 30 января 2009

Эта и другая мнемоника, такая как BOOL, LPCTSTR, берет свое начало с Windows, которая, кстати, была разработана до существования стандарта C, и чтобы не зависеть от конкретного компилятора, она использовала свои собственные типы.

Вы можете заглянуть в блог Old New Thing, чтобы узнать больше историй об истории разработки Windows и ее странностях, которые останутся с нами (http://blogs.msdn.com/oldnewthing).

4 голосов
/ 30 января 2009

Как уже говорили другие, это эквивалентно void *.

void указатели часто используются в операциях с памятью (memcpy, memset и т. Д.), Поскольку никто не хочет предполагать тип данных по данному адресу.

Указатели и пустые указатели получают хорошее лечение в этой статье от http://cplusplus.com.

4 голосов
/ 30 января 2009
typedef void * PVOID;

Если у вас вопрос, зачем использовать указатель void? Чаще всего используется, когда вы передаете указатель на память, которая на самом деле не заботится о типе. free (), например.

Если библиотека экспортирует функцию, которая может принимать несколько типов указателей, но хочет поддерживать такие языки, как C, у которых нет перегрузки функций, тогда void * работает.

1 голос
/ 30 января 2009

Похоже, это просто псевдоним (define или typedef) для void *. Я понятия не имею, почему люди думают, что это будет лучше, но я знаю, что некоторые API любят использовать это в случае, если реализация типа изменится в будущем.

Я знаю, что ранние версии Windows использовали такие вещи, как STDCALL, в качестве префикса для многих функций, и определение STDCALL может меняться в зависимости от того, для какой версии Windows вы скомпилировали. Это из памяти (которая страдает от алкоголя через много лет :-), поэтому не полагайтесь на это как на Евангелие. Это в основном правильно, но детали могут быть немного другими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...