2016-10-29 79 views
2

我編譯代碼每次運行不同的輸出?

#include <iostream> 

int* func(int a) { return &a; } 

int main() { 
std::cout << func(2) << std::endl; 
} 

後,當我運行可執行多次,它在每次運行返回的值不同。這使我困惑,我本來會期望編譯器刪除所有變量名稱並用固定的內存地址替換它們,因此在每次運行可執行文件時,我都應該獲得相同的值?

+5

你編譯的理解是錯誤的。 –

回答

3

每次運行程序時,操作系統都會爲其分配不同的內存部分。

所以,不要指望每次你將有相同的內存地址相同的變量。

Operating System - Memory Management

+0

感謝您的提示 - 請問您能更具體些嗎?你是指堆還是堆?究竟在每次運行中究竟分配了哪些地方,這會使其採用不同的值? – user7088945

+0

@ user7088945我已添加教授鏈接。在那裏你可以如何將新進程放入內存 –

0

我只想補充一點,你會從gccclang得到一個警告。你甚至不用通過任何警告標誌被告知有關的錯誤:

鐺++:

warning: address of stack memory associated with local variable 'a' returned [-Wreturn-stack-address] 
int* func(int a) { return &a; } 

G ++:

warning: address of local variable ‘a’ returned [-Wreturn-local-addr] 
int* func(int a) { return &a; } 
相關問題