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

2021-08-15 06:37:51 字數 562 閱讀 4534

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

遞迴呼叫時新建了乙個棧幀,並且跳轉到了函式開頭處執行,同一時刻可以有多個棧幀,但「當前**行」只有乙個。

「段」(segmentation)是指二進位制檔案內的區域,所有某種特定型別資訊被儲存在裡面。

呼叫棧並不儲存在可執行檔案中,而是在執行時建立。呼叫棧所在的段稱為堆疊段(stack segment)。和其他段一樣,堆疊段也有自己的大小,不能被越界訪問,否則就會出現段錯誤(segmentation fault)。

段錯誤:一般是陣列開小了。

棧溢位:每次遞迴呼叫時都需要往呼叫棧裡增加乙個棧幀,久而久之就會越界。建議把較大的陣列放在main函式外,棧溢位不一定是遞迴呼叫太多,也可能是區域性變數太大(區域性變數也是放在堆疊段的)

段錯誤與棧溢位

編譯後產生的可執行檔案裡儲存著什麼內容 和作業系統相關 在可執行檔案中,正文段 text segment 儲存指令,資料段 data segment 儲存已初始化的全域性變數,bss bss segment 儲存未賦值的全域性變數所需的空間。呼叫棧並不儲存在可執行檔案中,而是在執行時建立,呼叫棧所在...

c語言中的段錯誤

在linux環境下進行程式設計時常常遇到段錯誤。1.當更改常量的值時可引發段錯誤。例如定義字串常量 char s hello world!而試圖通過s來改變其中某個字母的值時 就會出現段錯誤!2.指標使用不當。例如,某一結構體型別的指標變數為空時,這是通過該指標訪問結構體中的變數時就會引起段錯誤。而...

C語言記憶體篇 10 棧的概念以及棧溢位

程式的虛擬位址空間分為多個區域,棧 stack 是其中位址較高的乙個區域。棧 stack 可以存放函式引數 區域性變數 區域性陣列等作用範圍在函式內部的資料,它的用途就是完成函式的呼叫。棧記憶體由系統自動分配和釋放 發生函式呼叫時就為函式執行時用到的資料分配記憶體,函式呼叫結束後就將之前分配的記憶體...