回答
'隨機'值只是在該位置的內存中剩下的內容。內存通常在釋放時不會被清除/歸零,因此,任何內存都會一直存在,直到它被覆蓋。
請參見[我的評論](http://stackoverflow.com/questions/17216663/ how-do-an-uninitialized-variable-get-a-random-value#comment51503431_17216663)...你應該注意到這是未定義的行爲。 –
的垃圾可能來自兩個位置:
- 當動態RAM上電時,將細胞保持在任意的狀態,直到初始化;這是大多數內存硬件實現的屬性
- 當你的程序運行時,它會留下以前使用但不在範圍內的變量值。該屬性可用於攻擊:分析程序遺留下來的垃圾可能會向不道德的插件或您使用的其他庫的作者提供信息。
未初始化變量的值是在將其分配給此變量之前存在於相應存儲區的值。大多數情況下,這是不可預測的,並取決於此內存區域之前發生的任何事情。
這實際上有時用作附加熵來生成僞隨機數。幾年前,Debian開發人員認爲未初始化的變量是OpenSSL中的一個錯誤,並將其設置爲零。然後生成的密鑰變得有些可疑,現在每個Debian用戶都必須在他們的機器上安裝一長串黑名單密鑰。
簡短的回答?這取決於你的編譯器 - 但不要這樣做。
長的答案:
訪問一個未初始化的POD的值(普通的舊數據,如int
)類型調用未定義行爲,這意味着C標準不會對在一個一致的實現的任何要求這個情況。因此,只要編譯器能夠證明在程序中的任何位置發生未定義的行爲,就允許編譯器發出啓動nethack
的機器代碼,格式化硬盤驅動器或完全不做任何操作,同時仍符合C標準。
(另請閱讀:What Every C Programmer Should Know About Undefined Behavior)
那麼,究竟是什麼(可能)會發生什麼?
在大多數現代編譯器未啓用優化時,編譯器將簡單地將堆棧(或寄存器)上的一個插槽分配給變量,然後在詢問時訪問該位置的任何內容。結果是看起來是「隨機存儲器」,雖然在現實中it's not very random at all。
如果我啓用了優化,會發生什麼情況?
如果您隨後在更高優化級別上編譯您的代碼(或者編譯器已更新,現在更積極優化),則所有投注都將關閉。例如,編譯器可以刪除涉及x
的任何調用,將x
指定到某個其他變量的相同位置(認爲x
不可能被使用,因爲它尚未初始化)或any other combination of strange effects。換句話說,當你訪問那個未初始化的變量時,你的程序可以開始做以外的任何東西以外的任何控制。不要這樣做 - 這裏是龍。
- 1. 未初始化變量如何獲得垃圾值?
- 2. 未初始化的DWORD變量賦予隨機值?
- 3. 隨機數未初始化
- 4. 如何從Clang 2.9獲得未初始化的變量警告?
- 5. 如何從tf.report_uninitialized_variables獲得未初始化變量的列表
- 6. 正在初始化一個未初始化變量的變量是否合法?
- 7. 未初始化的枚舉變量值
- 8. 未初始化的初始值常量
- 9. 如何初始化一個類變量?
- 10. 初始化一個變量
- 11. 變量中獲得初始化爲零
- 12. java變量未初始化
- 13. 變量未初始化
- 14. 變量未初始化
- 15. 變量未被初始化
- 16. C變量未初始化
- 17. 變量未初始化
- 18. PHP如何初始化/解釋一個未定義的變量?
- 19. 初始化一個變量到它自己的未定義值
- 20. 如何獲得不同的隨機數在C++中每個類的初始化
- 21. 變量可能尚未初始化(一)
- 22. 如何初始化變量無值
- 23. 如何初始化變量?
- 24. 如何初始化變量?
- 25. Java變量值初始化
- 26. Python-如何初始化隨機函數
- 27. 實際初始化的未初始化的局部變量?
- 28. 開始C.變量未被初始化
- 29. 如何在張量流中用小的非負隨機數初始化變量?
- 30. 初始化對象時,實例變量始終未初始化?
http://research.swtch.com/openssl –
試試吧,啓動你的程序幾次打印變量值:你會發現它遠遠不能用作隨機值 – Antonio
我做過。它每次給我同樣的價值。 C內存釋放如何工作? –