3 回答

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

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

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