0

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

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

例如:

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(){
}
4

1 回答 1

1

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

当你调用函数时,它的局部变量(包括参数)的空间被保留在堆栈上。

于 2013-06-30T04:21:08.660 回答