簡體   English   中英

由於堆棧溢出,C中通常會發生什么?

[英]What does typically happen in C due to stack overflow?

在Java中會有一個堆棧跟蹤,它表示StackOverflowError並且整個系統不會崩潰,只有程序崩潰。

在C中,我知道超出范圍的數組索引會產生分段錯誤。 對於C中的堆棧溢出是否相同,並且還存在分段錯誤,即類似問題的錯誤類型相同?

我沒有測試C中有意識的無限復活,看看會發生什么,因為我不知道后果。

或者它有時是更糟糕的事情,C中的堆棧溢出可能會導致操作系統故障並迫使您重新啟動電源以便返回? 或者更糟糕的是,造成不可逆轉的硬件損壞? 堆棧溢出錯誤有多糟糕的影響?

很明顯,Java中的保護比C中更好。在C中是否比在匯編/機器代碼中更好,或者它在C中作為匯編實際上是否相同(缺乏)保護?

在C中,我知道超出范圍的數組索引會產生分段錯誤。 對於C中的堆棧溢出是否相同,並且還存在分段錯誤,即類似問題的錯誤類型相同?

C中無法保證會出現分段錯誤。 C標准表明它是未定義的行為,並將其留在那里 它可能表現出來,取決於實現/平台。

或者它有時是更糟糕的事情,C中的堆棧溢出可能會導致操作系統故障並迫使您重新啟動電源以便返回? 或者更糟糕的是,造成不可逆轉的硬件損壞? 堆棧溢出錯誤有多糟糕的影響?

在現代操作系統中,很少有任何不幸發生在系統上; 通常,只有程序會崩潰。 現代操作系統使用各種存儲器保護技術

很明顯,Java中的保護比C中更好。在C中是否比在匯編/機器代碼中更好,或者它在C中作為匯編實際上是否相同(缺乏)保護?

那是因為在Java中,內存是“被管理的”。 在C中,它留給程序員; 這是設計的 AC編譯器最終生成機器代碼; 所以它不會更好或更糟。 顯然,一個好的編譯器可以檢測到其中的一些問題並警告你,這與C語言相比是一個優勢。

因為任何系統資源故障,內存故障的處理基本上由操作系統處理,而不是語言本身。

排除某些特定的預防操作,作為堆棧檢查,這種問題通常會觸發可由語言運行時處理的操作系統異常。

堆棧檢查是否已啟用,通常在編譯器命令行上指定一些開關,指示編譯器為每個堆棧消耗操作插入檢查探針代碼以驗證內存可用性。

默認情況下,當出於任何原因,過度使用堆棧或損壞時,執行嘗試訪問分配的堆棧空間范圍之外的內存,OS會觸發結構化異常。 Java盡可能多的C運行時通常會處理這些異常,並提供一些方法將它們傳遞給用戶代碼以便最終恢復(即通過信號或SEH)。 如果沒有從用戶代碼關聯處理程序,則控件將傳遞給運行時,默認情況下將控制受控任務關閉(優雅關閉)。

如果沒有可用的處理,即使從運行時也沒有,操作系統將關閉任務並突然執行資源緩解(即截斷文件,關閉端口等)。

在任何情況下,操作系統都會保護系統,除非操作系統有缺陷...

在C中,注冊一個保護可能失敗的代碼片段的處理程序是正常的。 處理異常的方式取決於您的操作系統(即在Windows下,您可以在異常處理程序__try __except包裝可能失敗的__try __except )。

這不是C問題,至少發生的事情不是由C指定的.C只會說它是未定義的行為。 因此效果是運行時的問題。 在任何合理的操作系統上,這都會產生某種錯誤,並且* nixes會對您的進程產生分段錯誤。 即使是異國情調的小型操作系統也可以保護自己免受錯誤處理。 無論如何,這絕不會讓操作系統崩潰。 Java並不比C 更好 ,它們是不同的語言並且具有不同的運行時。 從設計上講,Java在某種意義上更安全,它可以保護您免受許多內存問題 (包括其他內容)。 C可以讓您更好地控制機器,是的,它或多或少是一種匯編語言。

每個執行線程在運行時創建線程期間分配其堆棧。 如果在程序執行期間檢測到堆棧溢出(本機程序已編譯),則只會影響程序(進程),而不會影響操作系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM