c - C: 如何访问存储在 void 指针 (void *) 中的函数指针?
问题描述
对如何访问存储在 void 指针 (void *) 中的函数指针感到困惑。
假设你有这个:
void *functions[] =
{
&sqrt, // int ft_sqrt(int nb);
&power,
&logN,
&factorial;
};
// An array of void pointers, each storing a function pointer.
如果我想访问该sqrt
函数,我的猜测如下:
(int (*)(int)) functions[0](x)
但我的猜测是错误的:
error: called object type 'void *' is not a function or function pointer
那么如何访问这些功能之一呢?
解决方案
严格来说,你不能。函数指针和void
指针之间的转换是不可能的。void*
从来都不是函数指针的通用指针类型,仅适用于对象指针。它们不是兼容的类型。
实际上,任何指针很可能具有系统地址总线所需的大小,因此对象指针和函数指针很可能具有相同的表示。但是,标准不能保证,并且有一些奇异的系统,这种等效性并不成立。所以你可以在void*
和函数指针之间进行转换,但会发生未定义的行为。您将依赖系统特定的非标准扩展。
稍微好一点的是使用函数指针类型,例如void (*)(void)
通用指针。您可以在不同的函数指针之间进行转换,将会发生什么是编译器特定的(实现定义的行为)。也就是说,代码仍然是不可移植的,但至少你不会因为调用未定义的行为而导致程序崩溃。
推荐阅读
- r - 光栅堆栈或砖无法处理 greenbrown 包中的趋势图功能
- python - 如何构建一个接收元组列表的神经网络模型
- javascript - 使用 Javascript 突出显示 PDF
- javascript - 在 Electron 中加载 url 时添加返回按钮
- java - 我如何为我的对象正确定义 getter 和 setter 方法
- javascript - 等待一个 javascript 事件处理程序
- java - 在java中将乳胶字符串转换为格式化的文字字符串
- python - 如何将pybind11中的新属性设置为c ++中的python对象?
- r - 需要在 rstudio 中建立一个神经网络以获得汇率
- r - 使用 SLURM 在集群上运行作业时如何保存输出