我編譯代碼每次運行不同的輸出?
#include <iostream>
int* func(int a) { return &a; }
int main() {
std::cout << func(2) << std::endl;
}
後,當我運行可執行多次,它在每次運行返回的值不同。這使我困惑,我本來會期望編譯器刪除所有變量名稱並用固定的內存地址替換它們,因此在每次運行可執行文件時,我都應該獲得相同的值?
我編譯代碼每次運行不同的輸出?
#include <iostream>
int* func(int a) { return &a; }
int main() {
std::cout << func(2) << std::endl;
}
後,當我運行可執行多次,它在每次運行返回的值不同。這使我困惑,我本來會期望編譯器刪除所有變量名稱並用固定的內存地址替換它們,因此在每次運行可執行文件時,我都應該獲得相同的值?
退房Address space layout randomization一個可能的原因是,a
變量被存儲在不同的地址每次運行。
感謝您的提示 - 請問您能更具體些嗎?你是指堆還是堆?究竟在每次運行中究竟分配了哪些地方,這會使其採用不同的值? – user7088945
@ user7088945我已添加教授鏈接。在那裏你可以如何將新進程放入內存 –
我只想補充一點,你會從gcc
和clang
得到一個警告。你甚至不用通過任何警告標誌被告知有關的錯誤:
鐺++:
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; }
你編譯的理解是錯誤的。 –