<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    為什么會發生棧溢出


    發現錯別字 1個月前 提問
    回答
    1
    瀏覽
    82
    請勿發布不友善或者負能量的內容。與人為善,比聰明更重要!
    回答數量: 1
    上官雨寶
    CISM-WSE 中級信息安全等級測評師

    對每個程序來說,棧能使用的內存是有限的,一般是 1M~8M,這在編譯時就已經決定了,程序運行期間不能再改變。如果程序使用的棧內存超出最大值,就會發生棧溢出(Stack Overflow)錯誤,程序就崩潰了。

    • 函數遞歸調用層次太深:每次遞歸就相當于調用一個函數,函數每次被調用時都會將局部數據(在函數內部定義的變量、參數、數組、對象等)放入棧中。遞歸1000次,就會將1000份這樣的數據放入棧中。這些數據占用的內存直到整個遞歸結束才會被釋放,在遞歸過程中只會累加,不會釋放。如果遞歸次數過多,并且局部數據也多,那么會使用大量的棧內存,很容易就導致棧溢出了。

    • 局部靜態變量體積太大:第一種情況不太常見,因為很多情況下我們都用其他方法來代替遞歸調用,所以只要不出現無限制的調用都應該是沒有問題的,起碼深度幾十層我想是沒問題的,這個我沒試過但我想沒有誰會把調用深度作那么多。檢查是否是此原因的方法為,在引起溢出的那個函數處設一個斷點,然后執行程序使其停在斷點處,然后按下快捷鍵Alt+7調出call stack窗口,在窗口中可以看到函數調用的層次關系。

    • 動態申請空間使用之后沒有釋放:由于C語言中沒有垃圾資源自動回收機制,因此,需要程序主動釋放已經不再使用的動態地址空間。申請的動態空間使用的是堆空間,動態空間使用不會造成堆溢出。

    • 數組訪問越界:C語言沒有提供數組下標越界檢查,如果在程序中出現數組下標訪問超出數組范圍,在運行過程中可能會內存訪問錯誤。

    • 指針非法訪問:指針保存了一個非法的地址,通過這樣的指針訪問所指向的地址時會產生內存訪問錯誤。

    回答所涉及的環境:聯想天逸510S、Windows 10。

    1個月前 / 評論
    亚洲 欧美 自拍 唯美 另类