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

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

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

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

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

现在,如果我分配

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

它会给出错误

在互联网上我发现

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

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

EN

回答 2

Stack Overflow用户

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

演员们说:

  • 获取指向函数

的指针

  • 获取指向

的指针

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

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

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

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

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

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

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

票数 4
EN

Stack Overflow用户

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

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

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

https://stackoverflow.com/questions/23407808

复制
相关文章
打印棱形 for fun
叶茂林
2023/07/28
1320
打印棱形 for fun
Fun with Flags_01
各位亲爱的朋友, 还有什么更好玩的 idea, 尽管抛过来,小编一定接的妥妥的!
WolframChina
2018/05/31
4510
poj 1579 Function Run Fun
We all love recursion! Don't we?  Consider a three-parameter recursive function w(a, b, c):  if a
用户1624346
2018/04/11
7150
fstream的用法_fun 的用法
在C++中输入输出到指定文件,或者从指定文件中读出数据使用fstream类较为方便。
全栈程序员站长
2022/10/02
3.4K0
Fun with Flags_02
继续玩一会旗帜吧. 那在我们这个例子中想要把比较近似的旗帜放在一起.
WolframChina
2018/05/31
5920
腾讯微视 WESEE MORE FUN
Wesee friends Wesee lifestyle Wesee games Wesee original Wesee knowledge Wesee future WESEE MORE FUN
腾讯ISUX
2018/06/29
1K0
你fun的可是Weixin Pay?
来自葡萄牙的老板阿曼诺和来自广东的老板娘Lisa,经营着一家31年历史的“街头米其林”阿曼诺葡国餐厅。
小腾资讯君
2023/08/25
1660
你fun的可是Weixin Pay?
计算机如何理解我们的语言?NLP is fun!
【导读】我们从日常每天都会用到的推荐系统到现在研究火热的开放性聊天、对话机器人,越来越多的产品与应用的背后都需要自然语言处理(NLP)和知识图谱的技术。也有越来越多的学者与工作人员投身于 NLP 领域的研究。为什么要研究NLP呢?如果计算机想要更好的理解人类的语言,拥有更好的人机交互体验,都离不开 NLP。那么,计算机到底是如何理解人类语言的?接下来让我们跟着作者 Adam Geitgey ,和他一起体会自然语言处理技术里那些有意思的事情。
AI科技大本营
2018/08/17
1.6K0
计算机如何理解我们的语言?NLP is fun!
动态库的制作与两种使用方式你掌握了吗?
在《如何制作属于自己的静态库》中简单介绍了静态库的制作方法,但实际上动态库的使用更为广泛,至于原因,在《静态库和动态库的区别》一文中已有说明。本文介绍动态库的制作方法以及两种使用方式。
编程珠玑
2019/07/22
1.5K0
c语言dlsym函数_dlsym
dlsym根据动态链接库操作句柄与符号,返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
全栈程序员站长
2022/11/15
7060
PAT 甲级 1023 Have Fun with Numbers
1023. Have Fun with Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will
ShenduCC
2018/04/27
6780
Just for fun——分解一个正
为什么我要记录这个问题,因为之前面试的时候遇到过,当时自己写的算法不好,所以,在此记录一下
py3study
2020/01/02
4670
好玩的文字流程图:flowchart-fun
并且,它能实现的效果,也不止是上面展示的这么简单,具体详情,不如一起来在线试试 ~
用户9925864
2022/07/27
1.2K0
好玩的文字流程图:flowchart-fun
手动清除fun.xls.exe病毒的方法[通俗易懂]
1.结束注册表中的fun.xls.exe的进程(建议选中fun.xls.exe->右键->转到进程,查找到“algsrvs.exe” 单击它,再选择“结束进程”)
全栈程序员站长
2022/09/06
9770
C语言中的函数指针(*(void(*)())0)();
我刚开始学习C语言的时候是写简单的数学运算在黑框框里面跑,然后用C语言写51单片机的代码,再到后来玩stm32,学应用层编程,学内核编程等,框架结构逐渐变的复杂,也越来越觉得对C语言的理解还不够到位。真是越往下学,越觉得水深啊!个人总结一下C语言中有关函数的知识,如有问题请留言指明*v*
HeaiKun
2020/07/06
1.9K0
6 Fun Things You Can Do With Just CSS
While there are some fabulous preprocessors like SCSS(that get compiled into CSS eventually) and offer more features than normal CSS, this does not mean that you can’t do amazing things by just using plain, standard CSS.
唐志远
2023/08/01
1440
6 Fun Things You Can Do With Just CSS
区块链:它是什么,它是如何工作的
编者按:本报告是由《威胁镜头》,Stratfor的独特保护情报产品制作的。以企业安全领导者的头脑设计,威胁镜头使行业专业人士能够预测、识别、衡量和减轻世界各地的人们和资产面临的威胁。
架构师研究会
2018/07/25
6410
区块链:它是什么,它是如何工作的
使用ffmpeg压缩视频之烦和fun
LD使用手机录了一个直播健身操课程的视频,想要放到她十多年前的一个上网本上播放,方便她不在老家的时候丈母娘可以照着跳操锻炼身体,原本一个很简单的诉求,没想到过程还挺曲折的, 所以,有必要记录并分享出来,以免其他人也有类似的诉求需要满足。
扶墙老师
2020/07/23
1.6K0
使用ffmpeg压缩视频之烦和fun
你必须知道的指针基础-7.void指针与函数指针
  void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。
Edison Zhou
2018/08/20
9750
你必须知道的指针基础-7.void指针与函数指针
void 指针笔记
但是和其他类型的指针不一样的地方是,void 指针不知道自己保存的地址的内容的数据类型,因此无法解引用:
太阳影的社区
2021/12/24
6770

相似问题

int fun(void **args)并在调用函数时传递参数fun(args),

12

"fun“和"&fun”的类型不同?

21

Match.fun错误(FUN):

10

调用函数作为fun()和fun有什么不同?

43

Match.fun中的错误(FUN)

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档