為什麼會陷入死迴圈

2021-06-05 16:53:55 字數 1102 閱讀 7908

看似簡單的一段程式如下:

int main()

在unix/linux平台下,gcc編譯執行會陷入死迴圈.  

因為變數 i 和陣列 j[8]是儲存在棧中,預設是由高位址向低位址方向儲存. 輸出變數位址可以發現: i 儲存位置在0xbfd90dec, j[0]、j[1]...j[7]在記憶體的位址分別是0xbfdab05c、0xbfdab060,...0xbfdab078. 如下所示:

高位址 <--------------------------------------->低位址

i,j[7],j[6],j[5],j[4],j[3],j[2],j[1],j[0]

如果在int i,j[8]後面再定義變數int c,那麼c就存放在j[0]的往低方向的下乙個位址0xbfdab058 .

現在不難理解這段程式為什麼會出現死迴圈了。j[8]的位置就是變數i所在的位置。這樣當i=8時的j[i]=0語句,實際上就是將i的值置為0,然後 i 又從0到8迴圈一直下去.  

如果將原句改為int j[8],i; 就不會出現死迴圈,而僅僅是乙個段越界錯誤.

另乙個程式:

#include

int main()

printf("\n");

}編譯後執行

[foxman@local~]#./a.out

0    (輸入0)

i=0  (輸出 i 值)

1i=0

2i=0

3i=0

4i=0

...這樣一直迴圈下去。

問 題在於,c被宣告為char型別,而不是int型別。當程式要求scanf讀入乙個整數時,應該傳遞給它乙個指向整數的指標。而程式中scanf得到的卻 是乙個指向字元的指標,scanf函式並不能分辨這種情況,只能將這個指向字元的指標作為指向整數的指標而接受,並且在指標指向的位置儲存乙個整數。 因為整數所佔的儲存空間要大於字元所佔的儲存空間,所以c附近的記憶體會被覆蓋.

由上面分析,i 和 c 是由高位址到低位址儲存在棧中,這樣在c所在位置嘗試儲存乙個4位元組變數,會占用比c高的3個位元組(覆蓋掉 i 位元組的低3位),即使 i 總是為零,一直迴圈下去.

如果每次輸入ctrl+d作為字元終止符不儲存int到c處,那麼就會輸出正常i=0..4了.

mysql陷入迴圈 mysqld會陷入迴圈嗎?

我有乙個每天晚上執行的批量作業。它將幾十個資料庫中的某些新資料收集到乙個 資料庫 名為 ac 中,然後與sphinxsearch一起用於自動完成。批量作業及其查詢已執行可靠一年以上。今天我發現批處理作業卡住了。mysqld在乙個核心上使用100 的cpu,通常需要5分鐘的查詢在13小時後仍在執行。d...

vue router做路由攔截時陷入死迴圈

今天分享一下使用vue router做路由攔截時遇到的坑。需要提前了解的api 1 router.beforeeach to from next 確保要呼叫next方法,否則鉤子就不會被 resolved。我們一般在寫攔截時會這樣去寫 router.beforeeach to,from,next e...

為什麼死迴圈占用CPU高 整理貼

恰巧遇見這中問題,故將網上帖子整理下 整理如下 s 乙個程序如果是死迴圈,那麼占有的cpu會很高,可是作業系統時間片執行的,到了一定時間不是會自動切換到別的程序嗎?即便是死迴圈,到時間還是會切換到別的程序,為什麼占用cpu會高呢?死迴圈的時候程式不像其它的程式那樣可能在某處被阻塞,比如sleep了,...