3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超4個(gè)贊
靜態(tài)變量(文件范圍和函數(shù)靜態(tài))初始化為零:
int x; // zeroint y = 0; // also zerovoid foo() { static int x; // also zero}
非靜態(tài)變量(局部變量)是不確定的。在分配值之前讀取它們會(huì)導(dǎo)致未定義的行為。
void foo() { int x; printf("%d", x); // the compiler is free to crash here}
在實(shí)踐中,它們最初只是有一些荒謬的價(jià)值 - 一些編譯器甚至可能會(huì)在查看調(diào)試器時(shí)輸入特定的固定值以使其顯而易見 - 但嚴(yán)格來說,編譯器可以自由地執(zhí)行從崩潰到召喚的任何操作惡魔通過你的鼻腔通道。
至于為什么它是未定義的行為而不是簡單的“未定義/任意值”,有許多CPU架構(gòu)在其各種類型的表示中具有額外的標(biāo)志位。一個(gè)現(xiàn)代的例子是Itanium,它的寄存器中有一個(gè)“Not a Thing”位 ; 當(dāng)然,C標(biāo)準(zhǔn)起草人正在考慮一些較舊的架構(gòu)。
嘗試使用設(shè)置了這些標(biāo)志位的值可能會(huì)導(dǎo)致操作中的CPU異常確實(shí)不應(yīng)該失?。ɡ纾麛?shù)加法或分配給另一個(gè)變量)。如果你繼續(xù)保留未初始化的變量,編譯器可能會(huì)設(shè)置這些標(biāo)志位的隨機(jī)垃圾 - 意味著觸摸未初始化的變量可能是致命的。

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
它取決于變量的存儲持續(xù)時(shí)間。具有靜態(tài)存儲持續(xù)時(shí)間的變量始終隱式初始化為零。
對于自動(dòng)(本地)變量,未初始化的變量具有不確定的值。除其他外,不確定值意味著您可能“看到”該變量中的“值”不僅不可預(yù)測,甚至不能保證穩(wěn)定。例如,在實(shí)踐中(即忽略UB一秒鐘)此代碼
int num;int a = num;int b = num;
不保證變量a
并且b
將接收相同的值。有趣的是,這不是一些迂腐的理論概念,這在實(shí)踐中很容易作為優(yōu)化的結(jié)果發(fā)生。
所以一般來說,流行的答案“它是用內(nèi)存中的垃圾進(jìn)行初始化”甚至都不是很正確的。未初始化的變量的行為是一個(gè)變量的不同初始化垃圾。
- 3 回答
- 0 關(guān)注
- 1094 瀏覽
添加回答
舉報(bào)