函数指针的指针值代表什么?

时间:2010-10-14 05:22:42

标签: c pointers function-pointers

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

例如:这段代码:

#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数据段/代码段的确切关系有点混淆。任何有用的指示都会非常受欢迎。另外,我的第一个问题,所以请温柔,我真的想学习。谢谢!

3 个答案:

答案 0 :(得分:5)

这是函数入口点的地址 - 其代码的开头。 a变量位于堆栈上,所以毫不奇怪,它的地址差别很大 - 堆栈和代码被分配了不同的代码区域,可能相距甚远。

答案 1 :(得分:3)

本书 UNIX: Systems Programming 中的图片应该清楚明白。

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

alt text

答案 2 :(得分:2)

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

我想在实践中它不太重要,但需要注意一个好的事实。当您尝试学习C的私密细节时,Esp。