在最簡單的形式程序是爲什麼此C程序不會導致字母數字值出現分段錯誤?
int main(){
int x;
scanf("%d",x);
}
當我們給這個程序的任何數值輸入它無法通過產生段錯誤信號,這是我們應該期待什麼。
但是,如果我們改爲給它任何字母數字值,它不會失敗。
發生這種行爲的scanf
是怎麼回事?
這是從GDB回溯與數值運行它時:
(gdb) bt
#0 0x00000034e7456ed0 in _IO_vfscanf_internal() from /lib64/libc.so.6
#1 0x00000034e74646cd in __isoc99_scanf() from /lib64/libc.so.6
#2 0x0000000000400553 in main()
那麼爲什麼不失敗像「一」或「dfgb」任何字母數字值?
您試圖在此推理* undefined behavior *。在這種特定情況下,可能是因爲輸入與格式字符串不匹配,所以'scanf'甚至不會嘗試訪問第二個參數。但我不會依賴它。 「 –
」如果輸入流中的某個字符與格式字符串衝突,則函數結束,並以'匹配'失敗結束。衝突字符留在輸入流中,就好像它沒有被讀取一樣。您的字母輸入無法匹配預期的十進制格式,因此'scanf()'退出時不會嘗試向錯誤的「地址」寫入任何內容。 –
不贊同「當我們給這個程序任何數字值作爲輸入時,它會產生一個段錯誤信號,這是我們應該期待的。」。使用此代碼,提供數字輸入會導致未定義的行爲,而不一定是seg故障。 Seg是一種可能的期望,但不是唯一的期望。 – chux