指向函数的指针如何指向内存中尚不存在的内容?为什么原型有不同的地址?
How can pointers to functions point to something that doesn't exist in memory yet? Why do prototypes have different addresses?
据我所知,函数在主函数中被调用后,直到运行时才会被添加到堆栈中。
那么,如果函数的指针不存在于内存中,那么它怎么能有函数的内存地址呢?
例如:
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(){
}
函数总是在内存中,但不在堆栈中。它们是与程序的其余部分一起加载的代码的一部分,并被放在一个特殊的只读内存段中。
当调用函数时,堆栈上会为其局部变量(包括参数)保留空间。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么以及如何使用原型设计模式
- 为什么现代C 仍然保留旧的C样式原型,用于int argc,char ** argv
- 为什么这种类型的函数原型会引发错误?
- 为什么第一个原型是正确的,而第二个原型是不正确的
- 为什么这不起作用(C++函数原型)
- 为什么 C++11 从 std::vector 的填充构造函数的原型中删除了默认值?
- 为什么我收到叮当警告:函数"diff"没有以前的原型
- 为什么类声明排序对于原型仍然很重要
- 为什么他们在原型模式中这么说 - 用于在需要新对象时简单地复制原始对象
- 为什么函数原型中没有参数是首选
- 为什么你可以把一个函数原型放在一个函数里面
- 为什么这个代码不起作用?( &阵列在原型中)
- 指向函数的指针如何指向内存中尚不存在的内容?为什么原型有不同的地址?
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 为什么即使没有任何类声明也需要原型
- 通过MCQ测试,我们不确定为什么这个函数原型会失败
- 为什么这个参数在regex_match的原型中排序
- 为什么函数原型中的参数数量与定义中的参数不匹配