C++类型转换:将void指针转换为类指针

29
如何将指向void对象的指针转换为类对象?

你是如何获得指针的?你怎么知道它确实指向一个对象?你怎么知道它指向的是什么类型的对象? - Karl Knechtel
1个回答

42

使用static_cast进行转换。注意,只有当指针确实指向指定类型的对象时才能这样做;也就是说,指向void的指针的值是从指向此类对象的指针中获得的。

thing * p = whatever(); // pointer to object
void * pv = p;          // pointer to void
thing * p2 = static_cast<thing *>(pv); // pointer to the same object

如果你发现自己需要这样做,你可能需要重新考虑你的设计。你放弃了类型安全,使得编写无效代码变得容易:

something_else * q = static_cast<something_else *>(pv);
q->do_something();  // BOOM! undefined behaviour.

2
@MarceloCantos:为什么要使用比你需要的更危险的转换? - Mike Seymour
3
不,这是正确的。static_cast 用于撤销隐式转换,类指针到 void 指针的转换是一种隐式转换。 - Alok Save
3
好的,我会接受惩罚。我一直以为将 void * 强制转换为 X * 应该总是使用 reinterpret_cast,因为这就是它的作用。但我现在知道我错了。 - Marcelo Cantos
1
reinterpret_cast 最常用于将 X* 转换为 Y*,其中 XY 都是原始类型,并通常对内存布局进行一些特定于机器的假设。即使您知道确切的架构,也很难以这种方式避免 UB。 - Karl Knechtel
4
我不理解关于这件事的文档。如果void*不能转换为类实例,会返回nullptr还是损坏的指针? - Tomáš Zato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接