试图理解函数指针实际代表什么?它是函数所在代码段中的地址吗?
例如:这段代码:
#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数据段/代码段的确切关系有点混淆。任何有用的指示都会非常受欢迎。另外,我的第一个问题,所以请温柔,我真的想学习。谢谢!
答案 0 :(得分:5)
这是函数入口点的地址 - 其代码的开头。 a
变量位于堆栈上,所以毫不奇怪,它的地址差别很大 - 堆栈和代码被分配了不同的代码区域,可能相距甚远。
答案 1 :(得分:3)
答案 2 :(得分:2)
要记住的一件事是您的代码并非完全符合标准。如果您使用gcc -Wall -Wextra -pedantic -ansi,您将收到有关打印函数指针的行的投诉。这是因为标准不保证函数指针可以转换为void指针。 C设计用于许多不同的体系结构,如果体系结构是哈佛体系结构(单独的指令和数据存储器),那么可能有充分的理由使这些指针具有不同的大小。
我想在实践中它不太重要,但需要注意一个好的事实。当您尝试学习C的私密细节时,Esp。