亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果未在“ scanf”語句中放入“&”,將會發生什么?

如果未在“ scanf”語句中放入“&”,將會發生什么?

C
米琪卡哇伊 2019-11-19 15:05:57
我去接受采訪時被問到以下問題:您如何看待以下內容?int i;scanf ("%d", i);printf ("i: %d\n", i);我回答了:該程序將成功編譯。它將打印錯誤的數字,但是它將一直運行到最后而不會崩潰我的回答是錯誤的。我不知所措。之后,他們解雇了我:在某些情況下,該程序將崩潰并導致核心轉儲。我不明白為什么程序會崩潰?誰能解釋我的原因?任何幫助表示贊賞。
查看完整描述

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包含不確定的值,因此有可能包含與存儲地址相同的值,或者包含超出存儲地址范圍的值。


在這兩種情況下,程序都可能會出現異常行為,并導致未定義的行為。在這種情況下,可能會發生任何事情。


查看完整回答
反對 回復 2019-11-19
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

因為它會調用未定義的行為。該scanf()系列函數期望一個指向整數時,"%d"符中找到。您正在傳遞一個整數,該整數可以解釋為某個整數的地址,但不是。這在標準中沒有定義的行為。它確實可以編譯(但是會發出警告),但是肯定會以意外的方式工作。

就目前的代碼而言,還有另一個問題。該i變量從不初始化,因此它將具有不確定的值,這也是Undefined Behavior的另一個原因。

請注意,該標準并沒有說明當您期望給定其他類型時傳遞給定類型時會發生什么,無論您交換哪種類型,它只是未定義的行為。但是這種特殊情況需要特別考慮,因為可以將指針轉換為整數,盡管只有在轉換回指針并且整數類型能夠正確存儲值的情況下才定義行為。這就是為什么它可以編譯,但是肯定不能正常工作。


查看完整回答
反對 回復 2019-11-19
?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

您將類型錯誤的數據(應該int*是,但是int傳遞了)傳遞給scanf()。這將導致不確定的行為。

未定義的行為可能會發生任何事情。該程序可能會崩潰,也可能不會崩潰。

在典型的環境中,我猜想將指向操作系統不允許寫入的位置的“地址”傳遞給時scanf(),程序會崩潰,并且寫入該指令將使OS終止應用程序,它將被視為崩潰。


查看完整回答
反對 回復 2019-11-19
  • 3 回答
  • 0 關注
  • 615 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號