2014-12-06 92 views
1

爲什麼當我運行像不同的邏輯地址

int i; 
printf("%p\n", &i); 

我每次我運行它時得到不同的邏輯地址,我不應該得到,它被映射到不同的物理地址相同的邏輯地址每次運行它?

回答

0

將內存分配給堆棧中的變量或程序。所以內存分配是基於堆棧中可用的空間。當程序首先執行一些內存將分配給該執行功能。下一次我們執行相同的功能時,堆棧內存將有其他一些空閒內存。簡單每次我們運行程序,我們都會得到該程序的新堆棧地址。

+0

@ tommy_p1ckles:「每次我們運行程序,我們都會得到該程序的新堆棧地址」 - 這通常不正確。每次運行程序時,操作系統都可能會將其加載到不同的物理地址中,但程序的內存地址空間內堆棧的偏移量保持不變。 – 2014-12-06 06:38:13

0

這是一個根據您的函數(主函數或其他函數)的起始地址存儲在堆棧中的變量。它的地址相對於功能固定。每次程序執行時,主函數都會以任意地址開始。

0

在以下每種情況下,所述存儲器地址是在程序的執行常數:

  • 靜態本地變量
  • 靜態全局變量
  • 非靜態全局變量

另一方面,局部變量的內存地址取決於執行程序時的堆棧狀態(SP寄存器的值)。函數被調用。