c++ - 如何使用void指针(void*)

标签 c++

void 实际上并不是一个特定的类型。那么系统如何判断内存块的结尾从而加密数据 block 的值呢?如果您知道内存中的数据,那么您当然可以将类型从 void 更改为特定类型,但是当您不知道时呢?语言设计者提出这个概念的目的是什么?

最佳答案

这主要在 C 中用于将数据传递给回调函数或构建通用容器。每当您想要从具体数据类型中进行抽象时,就会使用它。类型“void *”只能传递指针,有时这就是您所需要的。

但是你是对的,如果你想实际访问数据,你必须在某个时候将指针类型转换回具体的数据类型。所以一些代码必须真正记住类型(并且它必须正确,否则你读到的都是垃圾!)。但并非所有代码都必须知道类型。有些函数可以将其称为“void *”,因此更加抽象:然后,链表可用于包含字符串或矩阵或任何您想要的内容,而无需为每种类型重新编程列表代码。

在 C++ 中,您可以通过在回调数据的情况下使用继承(接口(interface))或在容器的情况下使用模板来避免潜在的不安全转换。

顺便说一句。在 C/C++ 中,很多情况下你实际上无法知道“数据 block 的结尾”,这对于“void *”指针来说并不特殊。这就是为什么存在如此多危险的缓冲区溢出的原因。

关于c++ - 如何使用void指针(void*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27037293/

相关文章:

c++ - pthread 我可以获得原始参数吗?

android - 在 CMakeLists 中设置 ANDROID_STL

android - 带有 Android NDK undefined reference 的 OpenCV

c++ - 如何处理浮点计算中的超精度?

c++ - 数组声明为 unsigned char 时的垃圾值

c++ - 在.lib 中使用#ifdef 并在linkin 项目中定义变量

c++ - 为什么需要复制扣除候选作为单独的扣除指南?

c++ - 如何存储多次插件解析的函数表达式?

类内变量的 C++ 运算符重载

c++ - 是否有任何不属于 C++ 标准库的 STL header ?