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

回答

1

函數是總是在內存中,而不是在堆棧上。它們是程序其餘部分加載的代碼的一部分,並被放入特殊的只讀內存段中。

當你調用函數,那麼它的局部變量(包括參數)的空間保留在堆棧上。

+0

謝謝。那完全有道理。你正在談論文本區域的部分內存的正式名稱? –

+0

@KacyRaye是的,這是「文字」細分市場。 –

+0

非常感謝!我不知道文本區域實際上有內存地址。就像大多數時候人們都在談論堆棧或堆棧一樣,這種想法從來沒有出現過。這實際上也回答了我的第二個問題,因爲實現的功能位於文本區域的不同部分。謝謝! –

相關問題