在c / c ++中使用void指针

时间:2011-02-26 03:11:17

标签: c++ c security pointers void-pointers

嘿,我想知道在使软件更安全,更灵活方面如何在现实世界中应用无效指针。 例如,我知道void指针,它将向外部隐藏的指针,这将使软件更安全。 是否有其他原因可以使用void指针?

4 个答案:

答案 0 :(得分:12)

无效指针不会使软件更安全。

在c中使用void *的原因是多态的一种形式 - 如果你不知道数据的类型,你可以传递一个void *

在C ++中,不需要使用void *,语言会阻止某些C使用

答案 1 :(得分:1)

  

例如,我知道这是无效的   指针,它将转换为什么指针   隐藏在外面,这将使   一种更安全的软件。

编译完成后,汇编代码中没有任何明显的东西可以显示指针的类型,因为类型是更高级别的概念 - 汇编代码中只有寄存器宽度。 (从理论上讲,通过研究汇编代码,你可以推断出数据类型的大小以及各种字段的用途,但是使用void指针不会改变它。但我离题了。)

话虽如此,“外部”知道指针类型的唯一方法是通过您提供的API(可能通过头文件)。但这是拥有API的优势之一 - 允许其他人传递指针绝对不能保证你在内部使用该类型。

答案 2 :(得分:0)

使用void *的典型原因是为API /库的用户提供上下文。提供的上下文通常是指针,void *使其不透明。库开发人员遇到的问题是在传回时验证void *。这可能非常具有挑战性。实际上,最好不要向用户提供标识符,这样可以更容易地验证,而不会暴露内部数据。

换句话说,如果您考虑使用void *,请不要。

答案 3 :(得分:0)

即使在C中也没有理由以你提到的方式使用void*。使用指向不完整类型的指针可以做得更好。

typedef struct myInternal myInternal;
myInternal* getIt(void);
int doIt(myInternal*);

通过这种方式,您可以将内部结构/实现隐藏到用户。但使用它进行编程要容易得多,特别是用户不能混淆不同的不透明界面。