簡體   English   中英

初始化未初始化的值?

[英]Uninitialized values being initialized?

在C中,自動變量(如果未初始化)保存垃圾值。 但是,請考慮以下程序:

int main(){
 signed char term;
 (char)term--;
 printf("%d\n",term);
}

它打印的值為'7'。 如果我不做(char)term-- ,則打印值為'8'。 所以,它肯定沒有垃圾價值。 這不矛盾嗎?

那是垃圾。 你得到8作為垃圾,減去得到7。

這是未定義的行為。 僅僅因為你持續獲得8並不意味着它的定義很明確。 嘗試在代碼中執行更復雜的操作。 char上方和下方添加變量。


關於你的“測試”,你說:

但是,考慮到垃圾應該是隨機的,因此很難忽視一致性。

你需要檢查你的假設。 “垃圾應該是隨機的”誰說? 根據垃圾應該隨機怎么辦? 垃圾隨機的唯一方法是系統是否定期通過內存並為其分配隨機數。

當我們說“隨機”時,我們的意思是我們不知道它會是什么。 這並不能使它成為非確定性的。 這些是電腦。 如果你告訴他們一遍又一遍地做同樣的事情,它會一遍又一遍地做同樣的事情。

您的編譯器和設置會生成相同的代碼,最終會為您提供這些垃圾值。 確定性,但你不能依賴這種行為:“隨機”。

此外,1-800並不意味着你像你一樣采取這個。 “8”並不一定表示垃圾,就像設置事物一樣,你的編譯器用8填充它們。他的意思是8就像任何其他數字一樣垃圾。

值8包含在被認為是“垃圾”或“未初始化”的數字集合中。

就值而言,垃圾是一些先前函數留在堆棧上的任何東西。 更改libc或任何數量的東西,該數字將會改變。

你似乎已經把“垃圾”和“非確定性”這兩個術語搞混了。 術語中的值被認為是垃圾,因為您無法控制其中的值。它可以從平台更改為平台或運行運行,即未定義的行為。

另一方面,如果程序運行時環境中的所有內容都相等,則每次運行的值可能都相同。 但是,這並不排除它成為垃圾。

它確實持有垃圾,它保存8位垃圾,並從0-255讀取二進制數字(假裝你使用unsigned char)。

所以內存可能是這樣的:

| 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 0 1 |

它結束了(1 0 0 1 0 1 0 1)並將其讀作數字,即149.它只取決於指定長度的點中的隨機二進制數(例如:unsigned char = 1 byte)

如果它是unsigned int,則需要4個字節的隨機垃圾並使其成為一個數字。

可以將其視為使用任意值(位模式)進行初始化。

該任意值取決於變量的堆棧位置最后使用的位置,它絕對不是隨機值。 它可能或可能不總是相同的值。 它可以取決於之前發生的任何事情。

最好始終初始化自動變量以避免未定義的行為。

謝謝你的回答。 我嘗試了一點修改:

int main(){
           signed char term1;
           signed char term2;
           signed char term3;
           printf("%d\n%d\n%d\n",term1,term2,term3);
}

我在3台不同的機器上運行程序。 結果在所有3台機器上都相同:term1得到值= -124,term2 = 4,term3 = 8.如果我刪除term3,term1 = 4,term2 = 8.如果我刪除term2,term1 = 8.所以,基本上,作為signed char去掉的最后一個值得到值'8'。 正如1800 INFORMATION所說,'8'是用於表示垃圾的值之一,這可能是它。 但是,考慮到垃圾應該是隨機的,因此很難忽視一致性。

暫無
暫無

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

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