3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
定義變量后,編譯器會為該變量分配內(nèi)存。
int i; // The compiler will allocate sizeof(int) bytes for i
i 上面定義的未初始化,并且具有不確定的值。
要將數(shù)據(jù)寫入分配給的內(nèi)存位置i,您需要指定變量的地址。該聲明
scanf("%d", &i);
用戶會將int數(shù)據(jù)寫入為分配的內(nèi)存位置i。
如果&未放置在前面i,scanf則將嘗試將輸入數(shù)據(jù)i而不是寫入存儲位置&i。由于i包含不確定的值,因此有可能包含與存儲地址相同的值,或者包含超出存儲地址范圍的值。
在這兩種情況下,程序都可能會出現(xiàn)異常行為,并導(dǎo)致未定義的行為。在這種情況下,可能會發(fā)生任何事情。

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
因?yàn)樗鼤{(diào)用未定義的行為。該scanf()
系列函數(shù)期望一個(gè)指向整數(shù)時(shí),"%d"
符中找到。您正在傳遞一個(gè)整數(shù),該整數(shù)可以解釋為某個(gè)整數(shù)的地址,但不是。這在標(biāo)準(zhǔn)中沒有定義的行為。它確實(shí)可以編譯(但是會發(fā)出警告),但是肯定會以意外的方式工作。
就目前的代碼而言,還有另一個(gè)問題。該i
變量從不初始化,因此它將具有不確定的值,這也是Undefined Behavior的另一個(gè)原因。
請注意,該標(biāo)準(zhǔn)并沒有說明當(dāng)您期望給定其他類型時(shí)傳遞給定類型時(shí)會發(fā)生什么,無論您交換哪種類型,它只是未定義的行為。但是這種特殊情況需要特別考慮,因?yàn)榭梢詫⒅羔樲D(zhuǎn)換為整數(shù),盡管只有在轉(zhuǎn)換回指針并且整數(shù)類型能夠正確存儲值的情況下才定義行為。這就是為什么它可以編譯,但是肯定不能正常工作。

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
您將類型錯(cuò)誤的數(shù)據(jù)(應(yīng)該int*
是,但是int
傳遞了)傳遞給scanf()
。這將導(dǎo)致不確定的行為。
未定義的行為可能會發(fā)生任何事情。該程序可能會崩潰,也可能不會崩潰。
在典型的環(huán)境中,我猜想將指向操作系統(tǒng)不允許寫入的位置的“地址”傳遞給時(shí)scanf()
,程序會崩潰,并且寫入該指令將使OS終止應(yīng)用程序,它將被視為崩潰。
- 3 回答
- 0 關(guān)注
- 605 瀏覽
添加回答
舉報(bào)