这有什么意义:*(void **)(& fptr)= dlsym(handle,“my_function”);`

时间:2012-05-09 15:33:08

标签: c

代码来自此页面:http://pubs.opengroup.org/onlinepubs/009695399/functions/dlsym.html

你能帮我理解一下吗? 它接受函数指针的地址,将其转换为void **然后取消引用它。我不知道为什么它必须像这样工作。

感谢您的帮助!到目前为止,我所得到的唯一建议是“从右到左阅读”或类似“从右到左循环阅读”。

3 个答案:

答案 0 :(得分:10)

代码的含义是:

  1. fptr的地址。此表达式的类型是指向函数的指针(某种特定类型)。
  2. 将该指针表达式转换为“指向void的指针”。
  3. 取消引用访问对象fptr的指针,就像它是void *类型的对象一样。
  4. 将权利结果分配给步骤3中获得的左值。
  5. 不幸的是,在POSIX中编写此示例的人都处于破解状态,因为步骤3违反了C语言的别名规则,从而调用了未定义的行为。特别是,真实世界编译器将以破坏预期用途的方式优化此代码。

    此示例的作者尝试实现的目的是避免将指针的右侧从void 转换为指向函数的指针 。这是基于C标准要求此演员生成警告的声明,但我已经彻底搜索了这样的要求,并且没有找到这样的要求。

    如果确实存在这样的问题(警告要求),那么在不调用未定义行为的情况下使警告静音的唯一方法(如POSIX文本中的错误示例)就是这样做:

    void (*fptr)(); // or whatever function pointer type you want
    void *temp = dlsym(handle, "my_function");
    memcpy(&fptr, &temp, sizeof fptr);
    

答案 1 :(得分:1)

该函数返回一个函数指针。该代码说嘿接受我的函数指针变量给我的地址。将其投放到void **。现在请求void **并将void * =的值设置为我从调用中获得的指针。

答案 2 :(得分:0)

*(void **)(&fptr) = dlsym(handle, “my_function”);

为了使这更简单,

fptr是指针。

&fptr是该指针的地址。

您将其类型转换为pointer to a pointer to a void

然后引用并从函数中分配返回值。