首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数指针:*(void**) (&fun) = dlsym (lib,"fun")它是如何工作的?

函数指针:*(void**) (&fun) = dlsym (lib,"fun")它是如何工作的?
EN

Stack Overflow用户
提问于 2014-05-01 20:36:37
回答 2查看 1.3K关注 0票数 2

我使用dlsym来填充函数指针,它是call的成员变量。如下所示

代码语言:javascript
运行
复制
class ABC {
private: 
    void (*m_fun) (int);
}

现在,如果我分配

代码语言:javascript
运行
复制
m_fun = (void*) dlsym (libHandle, "fun") 

它会给出错误

在互联网上我发现

代码语言:javascript
运行
复制
*(void**) (&m_fun) = dlsym(libHandle, "fun") is working. 

有人能告诉我这个转换/转换是怎么发生的吗?

EN

回答 2

Stack Overflow用户

发布于 2014-05-01 20:42:05

演员们说:

  • 获取指向函数

的指针

  • 获取指向

的指针

  • 假装该指针指向常规对象指针(void*)而不是函数指针
  • 通过该指针写入D9返回的地址,从而将函数指针设置为指向该地址H210 F211

这绕过了(通常需要的)限制,即不能将函数指针赋值给对象指针。由于这是C++,您可以将其编写为:

代码语言:javascript
运行
复制
reinterpret_cast<void*&>(m_fun) = dlsym(libHandle, "fun");

这可能会更清楚一些:假设m_fun是一个void*,并写入它。

请注意,与将dlsym的结果转换为正确的类型并将其赋值相比,这种方法的可移植性较差:

代码语言:javascript
运行
复制
m_fun = reinterpret_cast<void(*)(int)>(dlsym(libHandle, "fun"));

它可以在任何平台上正常工作,或者会出现编译器错误。在具有非统一内存架构的平台上,不可靠的强制转换可能会导致未定义的运行时行为。

票数 4
EN

Stack Overflow用户

发布于 2014-05-01 20:48:22

Void*只是一个内存指针。要使用函数指针指向一个函数,首先需要一个指向实际函数的指针,其余的指针(**)需要指向变量和函数体。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23407808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档