2016-08-28 34 views
-6

我試圖在C中運行這段代碼,並期望運行時錯誤,但實際上運行沒有錯誤。你能告訴我發生這種事的原因嗎?字符數組可以容納比預期更多的數據

char str[10]; 
scanf("%s",str); 
printf("%s",str); 

當我初始化數組的大小爲10時,代碼如何打印超過10個字母的字符串?

+2

未定義的行爲。僅供參考:在'str'中有足夠的空間存放__9__個字符。 – tkausl

+0

可能重複[如何從鍵盤讀取字符串使用C](http://stackoverflow.com/questions/7709452/how-to-read-string-from-keyboard-using-c) –

+0

scanf功能讀取任意長度的字符串,所以你的代碼有一個未定義的行爲。 – linvoker

回答

0

這是一個很好的問題。而答案
是,它的確有內存問題
字符串被讀取並從str
了地址儲存直至實際讀取的字符串要求的長度,
和超過您分配的地方它。

現在,它可能不會立即崩潰,甚至曾經爲
短期課程,但它很可能當你擴大
程序,並定義其他變量,這個字符串將
超限他們,創造怪異各種各樣的bug,而且它可能最終也會崩潰。

總之,這是一個真正的錯誤,但它並不少見有
內存錯誤這樣一個不起初影響,但
確實創造了錯誤或更高版本程序崩潰。

+0

我可以問,爲什麼這條線斷? – Li357

+0

是的,因爲短行比較容易閱讀。 –

3

只要讀取或寫入的數組超出範圍,就會調用未定義的行爲

每當發生這種情況,程序可能會做任何想做的事情。甚至可以播放你的生日歌,儘管這不是你的生日,或從你的銀行賬戶轉賬。或者它可能會崩潰或刪除文件,或者只是假裝沒有發生任何不良事件。

在你的情況,它做了後者,但它不能得到保證。

要了解關於這種現象的更多細節,請閱讀關於利用緩衝區溢出,這是一個很大的話題。

1

C不對數組執行任何邊界檢查。這可能會導致緩衝區溢出攻擊您的可執行文件。

綁定檢查應該在用戶端完成,使其防止緩衝區溢出。

而是在一個陣列從fgets服用時輸入,始終使用sizeof(array) - 1運營商的陣列上採取這麼多,-1留下了空間'\0'字符幻數打字的。

相關問題