【发布时间】:2010-10-04 09:30:39
【问题描述】:
谁能解释一下PVOID 是什么以及它是如何在如下函数中使用的:
BOOL DoSomething(PVOID pMemPhy)
【问题讨论】:
-
相关链接:Windows Data Types
-
似乎是变体数据类型
谁能解释一下PVOID 是什么以及它是如何在如下函数中使用的:
BOOL DoSomething(PVOID pMemPhy)
【问题讨论】:
空指针,同
void *pMemPhy
又名“指向某物的指针,但由您自己决定”。
BOOL DoSomething ( PVOID pMemPhy )
{
strcpy((char *)pMemPhy, "I love buffer overflows!");
return TRUE;
}
【讨论】:
听起来它只是 void* 的别名(define 或 typedef)。我不知道为什么人们认为这会更好,但我知道一些 API 喜欢使用它,以防将来类型的实现发生变化。
我知道早期版本的 Windows 使用诸如 STDCALL 之类的东西作为许多函数的前缀,并且 STDCALL 的定义可能会根据您编译的 Windows 版本而改变。这是来自记忆(多年后受酒精影响:-),所以不要把它当作福音。基本是对的,但细节可能有点不同。
【讨论】:
typedef void * PVOID;
如果你的问题是空指针有什么用?最常见的用途是当您将指针传递给并不真正关心类型的内存时。例如,free()。
如果一个库导出一个可以采用多种指针类型的函数,但又想支持像 C 这样没有函数重载的语言,那么 void * 可以工作。
【讨论】:
它是一个 void 指针 -- 一个指向内存地址的指针,没有关于它所指向的值的类型的信息。因此,您必须在使用指针之前将指针转换为 (char *)pMemPhy 或 (int *)pMemPhy 等类型,以便编译器知道它正在使用多少内存(char 为 1 个字节,int 为 4 个字节,等等.)
【讨论】:
正如其他人所说,它相当于void *。
void 指针通常用于内存操作(memcpy、memset 等...),因为人们不想假设给定地址的数据类型。
thishttp://cplusplus.com 的文章中对指针和 void 指针进行了很好的处理。
【讨论】:
这个和其他助记符如 BOOL、LPCTSTR 起源于 Windows,顺便说一句,Windows 是在 C 标准存在之前开发的,并且不依赖于使用自己的类型的特定编译器。
您可以查看 Old New Thing 博客,了解有关 Windows 开发历史的更多故事,以及我们将继续关注的奇事 (http://blogs.msdn.com/oldnewthing)。
【讨论】: