【问题标题】:where is the address that a function pointer stores函数指针存储的地址在哪里
【发布时间】:2012-04-06 02:33:32
【问题描述】:

我知道函数指针存储函数的地址。

int fun(int x){
 //return something
} 
int (pfun*)(int)=&fun;

int main(){

std::cout << &fun << "\n"; // this print out 1
std::cout << fun << "\n" ; // this print out 1
std::cout << &pfun << "\n"; // this print out 0x0022ff40
std::cout << pfun << "\n" ; // this print out 1

 }

所以我的问题是:
1) 如果 fun() 甚至没有地址,pfun 怎么能指向 fun()。
2) 例如在动态绑定中,当我在运行时使用指针函数时。编译器是否将 pfun 值更改为像 0X 一样的真实指针.....以便在运行时知道要调用哪个函数,因为编译后名称不存在?

【问题讨论】:

    标签: c++ function pointers


    【解决方案1】:

    表达式fun&amp;fun 具有相同的含义:&amp;fun 相当于存储在pfun 中的值,因此它们三个产生相同的输出也就不足为奇了。 &amp;pfun是指针的地址,也就是变量的地址。

    现在的问题是为什么1... 嗯,答案是没有重载的operator&lt;&lt; 需要一个std::ostream 和一个函数指针,所以编译器试图在现有的恰好是bool 的重载(函数指针可隐式转换为bool)。只有当函数指针为空时,函数指针才会被转换为false,而事实并非如此。 true 值最终打印为 1(您可以通过以下方式检查:std::cout &lt;&lt; std::boolalpha &lt;&lt; fun 将打印 true)。

    如果您想获得函数的实际地址(在此过程中),您可以强制强制转换为 void 指针并打印结果。这在技术上可能不正确,但它会给您一个不同于1 的数字...请注意,该值在不同的运行中可能会有所不同,并且基本上没有任何意义。

    【讨论】:

    • 如果我没记错的话,将函数指针转换为void * 是不允许的。标准明确这么说,我认为...或者它是专门的成员函数指针,需要检查..
    • @Als:这就是答案中 技术上不正确 评论的原因。事实是 IIRC 它确实适用于大多数架构,该标准不能保证它,因为过去某些平台对函数和数据有不同的指针大小,这意味着转换为 void* 并返回到原始不会产生最初的结果……再说一次,正如我所提到的,即使在它确实产生价值的平台上,它也是无用的。
    • 不是明确提到将函数指针转换为void * 是无效的,仅适用于成员函数指针吗?甚至是独立的函数指针?
    • @AlexDan:对不起,我不太明白你的评论。我所说的如何得出结论 funpfun 之间没有区别? 另外,我看不出你所说的不涉及任何 vtable。
    • @Als 这只是一个错字,这个问题不适合你。对此感到抱歉。如果你想你可以回答这个问题,为什么编译器在 vtable 中使用函数指针而不是简单地使用函数名?
    【解决方案2】:

    operator&lt;&lt; 没有适当的重载来打印函数指针。试试这个吧。

    #include <iostream>
    
    void fun() {}
    
    void (*pFun)() = &fun;
    
    int main ()
    {
      std::cout << (void*)pFun << "\n";
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多