指向函数的指针如何指向内存中尚不存在的内容?为什么原型有不同的地址?

How can pointers to functions point to something that doesn't exist in memory yet? Why do prototypes have different addresses?

本文关键字:为什么 原型 地址 指针 函数 何指 内存 不存在      更新时间:2023-10-16

据我所知,函数在主函数中被调用后,直到运行时才会被添加到堆栈中。

那么,如果函数的指针不存在于内存中,那么它怎么能有函数的内存地址呢?

例如:

using namespace std;
#include <iostream>
void func() {
}  
int main() {
  void (*ptr)() = func; 
  cout << reinterpret_cast<void*>(ptr) << endl; //prints 0x8048644 even though func never gets added to the stack
}

另外,下一个问题对我来说不那么重要,所以如果你只知道我第一个问题的答案,那也没关系。但无论如何,当我声明函数原型并在main之后实现函数时,为什么指针的值(函数的内存地址)不同?

在第一个示例中,无论我运行程序多少次,它都会打印出0x8048644。在下一个示例中,无论我运行程序多少次,它都会打印出0x8048680。

例如:

using namespace std;
#include <iostream>
void func();
int main() {
  void ( *ptr )() = func;
  cout << reinterpret_cast<void*>(ptr) << endl;
}
void func(){
}

函数总是在内存中,但不在堆栈中。它们是与程序的其余部分一起加载的代码的一部分,并被放在一个特殊的只读内存段中。

调用函数时,堆栈上会为其局部变量(包括参数)保留空间。