段錯誤與棧溢位

2021-06-22 13:38:44 字數 399 閱讀 5364

編譯後產生的可執行檔案裡儲存著什麼內容:和作業系統相關

在可執行檔案中,正文段(text segment)儲存指令,資料段(data segment)儲存已初始化的全域性變數,bss(bss segment)儲存未賦值的全域性變數所需的空間。

呼叫棧並不儲存在可執行檔案中,而是在執行時建立,呼叫棧所在的段稱為堆疊段(stack segment)

每次遞迴呼叫都需要往呼叫棧裡增加乙個棧幀,久而久之就越界了,術語叫棧溢位(stack overflow)。

程式在執行時,會自動建立乙個堆疊段,裡面存放著呼叫棧,因此儲存著函式的呼叫關係和區域性變數。

宣告陣列時,建議「把較大的陣列放在main函式外」,因為區域性變數也是存放在堆疊段,棧溢位不見得是遞迴呼叫太多,也可能是區域性變數太大。只要總大小超過執行範圍,就會產生溢位。

C語言 遞迴中的段錯誤與棧溢位

c語言中,每次遞迴呼叫都會多乙個棧幀 和普通的函式呼叫並沒有什麼不同。由於使用了呼叫棧,c語言自然支援了遞迴。在c語言的函式中,呼叫自己和呼叫其他函式並沒有任何本質區別,都是建立新棧幀,傳遞引數並修改當前 行。在函式體執行完畢後刪除棧幀,處理返回值並修改當前 行。遞迴呼叫時新建了乙個棧幀,並且跳轉到...

隨筆 段錯誤, 數字大小溢位

這兩天被段錯誤,數字溢位弄的很狼狽。總結 對gdb 非常 不熟悉,我一定要做到隨心所欲 記得3個月前看 深入理解計算機系統 第二,三章的時候,那叫乙個痛苦,我也知道,這兩章也是本書的精華之二吧,當時不理解,在我們的程式中,就是隨便定義乙個int 就可以完事了,沒有必要弄的這麼複雜,什麼環,什麼範圍,...

彙編角度解釋溢位段錯誤

在編寫 時,由於讀寫了系統保護的記憶體或者訪問了給定位址以外的記憶體位址,這時會發生段錯誤,直接性的結果就是 出錯退出,這也僅僅是系統唯一能讓我們直觀的可知這是發生段錯誤了,但是對 在系統中的運 況以及記憶體情況一無所獲,因為高階語言遮蔽了這些底層的實現。但是所有的語言編譯的最終可執行 都是1和0形...