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(){
}
謝謝。那完全有道理。你正在談論文本區域的部分內存的正式名稱? –
@KacyRaye是的,這是「文字」細分市場。 –
非常感謝!我不知道文本區域實際上有內存地址。就像大多數時候人們都在談論堆棧或堆棧一樣,這種想法從來沒有出現過。這實際上也回答了我的第二個問題,因爲實現的功能位於文本區域的不同部分。謝謝! –