【问题标题】:What does the pointer value of a function pointer represent?函数指针的指针值代表什么?
【发布时间】:2010-10-14 05:22:41
【问题描述】:

试图理解指向函数的指针实际代表什么?是不是函数所在的代码段中的地址?

例如:这段代码:

#include <stdio.h>

void foo(void)
{
}

int main(void)
{
    int a = 10;
    printf("a's address: %p\n", &a);
    printf("foo's address: %p\n", foo);
    return 0;
}

...打印这个:

[sh/prog-exercises/adam]:./a.out 
a's address: 0xbfffb414 
foo's address: 0x8048430

我想我对进程的堆栈/堆与 ELF 数据段/代码段的关系有点困惑。任何有用的指示都会受到欢迎。另外,我的第一个问题,所以请温柔一点,我真的很想学习。谢谢!

【问题讨论】:

    标签: c pointers function-pointers


    【解决方案1】:

    这是函数入口点的地址——它的代码的开始。 a 变量位于堆栈上,因此它的地址明显不同也就不足为奇了 - 堆栈和代码被分配了不同的代码区域,它们可能相距甚远。

    【讨论】:

    • 对,所以这里的输出代表这个特定函数作为代码段的一部分被加载的位置?有没有办法让 C 程序打印数据段、代码段开始/结束地址?
    • @helpmelearn:对,就是函数start所在的地址。我不知道找到段地址的解决方案,我想它会依赖于实现。也许有一些实用程序可以对任何进程执行此操作。
    【解决方案2】:

    UNIX: Systems Programming 书中的这张图片应该让事情变得清晰。

    在图表的底部,您有您的程序文本(低地址)。可以从您的程序中验证。这就是 foo() 所在的位置。

    【讨论】:

      【解决方案3】:

      要记住的一点是,您的代码并不完全符合标准。如果您使用 gcc -Wall -Wextra -pedantic -ansi 您将收到有关打印函数指针的行的投诉。这是因为标准不保证函数指针可以转换为 void 指针。 C 被设计用于许多不同的架构,如果架构是哈佛架构(独立的指令和数据存储器),则可能有充分的理由使这些指针大小不同。

      我想在实践中它可能并不重要,但需要注意的一个很好的事实。特别是当你试图了解 C 的私密细节时。

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 2011-12-13
        • 2011-04-26
        相关资源
        最近更新 更多