簡體   English   中英

在C中,如果沒有為變量賦值,那為什么它會占用垃圾值?

[英]In C if a variable is not assigned a value then why does it take garbage value?

為什么變量采用垃圾值?

我想這個理由是你的程序會更快。

如果編譯器自動重置 (即:初始化為0或NaN為浮點數/雙精度等等)你的變量,那么這需要一些時間(它必須寫入內存)。
在許多情況下,初始化變量可能是不需要的:也許你永遠不會訪問你的變量,或者在你第一次訪問變量時會在其上寫。

今天,這種優化是有爭議的:由於初始化變量而產生的開銷可能不值得由錯誤未初始化的變量引起的問題,但是當C被定義時,事情是不同的。

未分配的變量具有所謂的不確定狀態,可以以任何方式實現,通常只是保持變量中現在占用的內存中的數據不變。

它只需要在變量所指向的地址處獲取內存中的內容。

分配變量時,您正在分配一些內存。 如果你不覆蓋它,內存將包含之前的任何“隨機”信息,這被稱為垃圾值。

為什么呢? 一個更好的問題可能是“你能解釋一下C#中初始化的成員變量是否具有已知的默認值?”

當在C中聲明變量時,它只涉及將內存分配給變量而不涉及隱式賦值。 因此,當您從中獲取值時,它會將內存存儲到您的變量數據類型中。 我們稱之為垃圾值的那個值。 它仍然如此,因為C語言實現具有內存管理,無法處理此問題。

使用malloc()從堆分配的局部變量和內存會發生這種情況。 局部變量是更典型的事故。 它們存儲在函數的堆棧框架中。 這是通過將堆棧指針調整為局部變量所需的存儲量來創建的。

這些變量在輸入函數時將具有的值基本上是隨機的,無論發生在先前函數調用的那些存儲器位置中,這些值恰好使用相同的堆棧區域。

這是一個難以診斷錯誤的令人討厭的來源。 至少因為價值不是真正隨機的。 只要程序具有可預測的呼叫模式,初始值很可能重復。 編譯器通常具有調試功能,允許它在初始化所有局部變量的函數的前導碼中注入代碼。 可能產生奇怪計算結果或受保護模式訪問沖突的值。

值得注意的是,托管環境自動初始化局部變量。 這樣做並不是為了幫助程序員陷入成功之中,這樣做是因為沒有初始化程序員是一種安全隱患。 它允許在沙箱中運行的代碼訪問由特權代碼編寫的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM