【问题标题】:How can pointers to functions point to something that doesn't exist in memory yet? Why do prototypes have different addresses?指向函数的指针如何指向内存中尚不存在的东西?为什么原型有不同的地址?
【发布时间】:2013-06-30 04:17:17
【问题描述】:

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

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

例如:

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

【问题讨论】:

    标签: c++ memory memory-management function-pointers function-prototypes


    【解决方案1】:

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

    当您调用该函数时,其局部变量(包括参数)的空间将保留在堆栈上。

    【讨论】:

    • 谢谢。那完全有道理。您所说的文本区域是内存部分的正式名称吗?
    • @KacyRaye 是的,它是“文本”部分。
    • 非常感谢!我不知道文本区域实际上有内存地址。就像我从来没有想过这个想法,因为大多数时候人们都在谈论堆或堆栈。这实际上也回答了我的第二个问题,因为实现的功能位于文本区域的不同部分。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多