【问题标题】:Why is the value of a pointer to a function 1 [duplicate]为什么指向函数的指针的值是 1 [重复]
【发布时间】:2016-10-25 22:04:09
【问题描述】:

我了解数据项之类的函数具有地址,函数的地址是存储的函数的机器语言代码开始的内存地址。我有这个代码;

#include <iostream>

using namespace std;

int x(int);
char * y(char *);

int main() {

    x(5);
    y("hello");

    int (*p) (int); //pointer to function x
    char * (*q) (char *); //pointer to function y

    p = &x; //holds the address of function x
    q = &y; //holds the address of function y

    cout << p << endl;
    cout << q;

    return 0;
}

int x(int a) {
    return (a * a);
}

char * y(char *b) {
    return (b);
} 

那么有没有一种方法可以强制 cpu 使用函数地址在另一个函数之前执行特定函数?

编译后,程序将两个地址都打印为1。我期待像数据项那样的十六进制值。即使我打印取消引用的值,我仍然得到1,这是怎么回事?

另外,如果两个函数地址都是1,cpu怎么知道先执行哪个函数呢?

编辑:

我的一个问题没有得到解答,我认为这非常重要!即使有些是重复的,也不会完全重复。

【问题讨论】:

  • operator&lt;&lt; 可能对流和函数指针做了一些奇怪的事情。例如。 endl 是一个函数指针,cout &lt;&lt; endl 只是做endl(cout)
  • 好吧,如果你走“老路”并使用 printf 你会得到正确的地址: printf("%p %p\n", p, q); //打印两个十六进制值

标签: c++ function-pointers


【解决方案1】:

std::cout 会将函数指针转换为布尔值,由于函数指针非零,所以显示值 1。

要显示为十六进制值,请将函数指针转换为 void *,例如:

cout << (void*)p << endl;

【讨论】:

  • 好的,谢谢。但是最后一个问题没有答案!
  • 你能澄清你的最后一个问题吗?这些函数是按照你调用它们的顺序执行的,所以我不确定你想问什么。
【解决方案2】:

您可以通过键入以下内容来检索这些函数地址: cout&lt;&lt; &amp;p &lt;&lt; endl &lt;&lt; &amp;q &lt;&lt; endl; &amp; 运算符返回块内存的地址,其中设置了 & 运算符之后的变量。

【讨论】:

  • 那不是指向函数的指针的地址而不是指向函数本身的指针的地址吗?
  • @Nana 是的,抱歉,我没有正确理解您的问题: &p 和 &q 是指向函数地址的指针的地址。所以王的答案是正确的。对于您的最后一个答案,是的,有一些方法可以修改程序的正确流程。例如,一种是使用缓冲区溢出来覆盖某些 cpu 寄存器以执行任意代码段(特别是 EIP 寄存器,该寄存器处理指向要执行的下一条机器指令的指针)。否则,这取决于您放置函数的顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多