Может кто-нибудь объяснить, что такое PVOID
и как он используется в такой функции, как:
BOOL DoSomething(PVOID pMemPhy)
Может кто-нибудь объяснить, что такое PVOID
и как он используется в такой функции, как:
BOOL DoSomething(PVOID pMemPhy)
указатель void, такой же, как
void *pMemPhy
aka "Указатель на что-то, но вам решать, чтобы понять это".
BOOL DoSomething ( PVOID pMemPhy )
{
strcpy((char *)pMemPhy, "I love buffer overflows!");
return TRUE;
}
Это указатель void - указатель на адрес памяти без информации о типе значения, на которое он указывает. По этой причине перед использованием указателя вы должны указать указатель на тип, например (char *)pMemPhy
или (int *)pMemPhy
, чтобы компилятор знал, сколько памяти он работает (1 байт для char, 4 байта для int, и т.д.)
typedef void * PVOID;
Если вы сомневаетесь в том, что используется указатель void? Наиболее распространенное использование - когда вы передаете указатель на память, который действительно не заботится о типе. free(), например.
Если библиотека экспортирует функцию, которая может принимать несколько типов указателей, но хочет поддерживать такие языки, как C, которые не имеют перегрузки функций, тогда работает void *.
Как говорили другие, это эквивалентно void *
.
void
указатели часто используются в операциях памяти (memcpy
, memset
и т.д.), так как вы не хотите предполагать тип данных по указанному адресу.
Указатели и указатели пустот получают хорошее лечение в этой статье из http://cplusplus.com.
Эта и другая мнемоника, такая как BOOL, LPCTSTR, имеют начало с Windows, BTW которой была разработана до существования стандарта C и не зависела в конкретном компиляторе, она использовала свои собственные типы.
Вы можете просмотреть блог Old New Thing, чтобы узнать больше о истории разработки Windows и о ее странностях, которые останутся у нас (http://blogs.msdn.com/oldnewthing).
Похоже, это просто псевдоним (define или typedef) для void *. Я понятия не имею, почему люди думают, что это будет лучше, но я знаю, что некоторые API-интерфейсы любят использовать это в случае, если в будущем произойдет изменение типа.
Я знаю, что в ранних версиях Windows такие вещи, как STDCALL, были префиксом для многих функций, и определение STDCALL могло измениться в зависимости от той версии Windows, которую вы скомпилировали. Это из памяти (на которую на протяжении многих лет влияет алкоголь:-), поэтому не полагайтесь на это как на Евангелие. Это в основном правильно, но детали могут быть немного разными.