嘿,我想知道在使软件更安全、更灵活方面,如何在现实世界中应用 void 指针。例如,我知道 void 指针,它将投射到的指针隐藏在外部,这将使软件更加安全。还有其他原因为什么您会使用 void 指针?
4 回答
无效指针不会使软件更加安全。
在 c 中使用 void* 的原因是多态性的一种形式 - 如果您不知道数据是什么类型,您可以传递 void*
在 C++ 中,使用 void* 的需求较少,并且该语言阻止了某些 C 使用
例如,我知道 void 指针,它将投射到的指针隐藏在外部,这将使软件更加安全。
编译后,汇编代码中没有任何明显的内容可以揭示指针的类型,因为类型是一个更高级别的概念——汇编代码中只有寄存器宽度。(理论上,通过研究汇编代码,您可能可以推断出数据类型的大小以及各种字段的用途,但使用 void 指针不会改变这一点。但我离题了。)
话虽如此,“外部”知道指针类型的唯一另一种方式是通过您提供的 API(可能通过头文件)。但这是拥有 API 的优势之一——允许其他人向您传递指针绝对不能保证您在内部使用该类型。
即使在 C 语言中也没有任何借口可以void*
按照您提到的方式使用。使用指向不完整类型的指针会更好。
typedef struct myInternal myInternal;
myInternal* getIt(void);
int doIt(myInternal*);
这样,您就具有向用户隐藏内部结构/实现的相同效果。但是使用它进行编程要容易得多,特别是用户不能像这样混合不同的不透明界面。
使用 void * 的典型原因是为 API/库的用户提供上下文。提供的上下文通常是一个指针,而 void * 使其不透明。库开发人员遇到的问题是在将 void * 传回时验证它。这可能非常具有挑战性。事实上,图书馆最好向用户提供一个标识符,该标识符可以更容易地验证,而无需暴露内部数据。
换句话说,如果您正在考虑使用 void *,请不要。