日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > MAC >内容正文

MAC

stckoverflow怎么进去(stckoverflow)

發(fā)布時間:2023/11/23 MAC 24 博士
生活随笔 收集整理的這篇文章主要介紹了 stckoverflow怎么进去(stckoverflow) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家好!今天讓小編來大家介紹下關于stckoverflow怎么進去(stckoverflow)的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。

您好,今天芳芳來為大家解答以上的問題。stackoverflow怎么進去,stackoverflow相信很多小伙伴還不知道,現(xiàn)在讓我們一起來看看吧!

1、顧名思義,stack overflow 就是是棧溢出了。

2、在進行數(shù)值運算時,我們常常要和運算結果的溢出打交道。

3、數(shù)值運算結果可能上溢(overflow),也可能是下溢(underflow)。

4、不過棧的溢出顯然只可能是上溢,即棧空間被用完了。

5、在提起“棧”(stack)這個概念的時候,千萬不要忘記了它的兄弟“堆”(heap),也要切記不要把二者搞混了。

6、 那么,什么時候會把給用完了呢?如果我們記得C程序中的局部變量是在棧中分配的,函數(shù)調(diào)用會占用一部分棧空間,則可以很容易地構造出相應的測試用例。

7、定義占用空間過大的局部變量所導致的棧溢出C:> more stack_local.c/* * Allocate too much memory from stack will cause stack overflow. */#include int main(int argc, char *argv[]){ int foo[1000000]; return 0;}C:> cl stack_local.cMicrosoft (R) 32bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86Copyright (C) Microsoft Corporation. All rights reserved.stack_local.cMicrosoft (R) Incremental Linker Version 8.00.50727.42Copyright (C) Microsoft Corporation. All rights reserved./out:stack_local.exestack_local.objC:> stack_local此時出現(xiàn)一個異常對話框:stacklocal.jpg 。

8、 2、函數(shù)遞歸調(diào)用導致的棧溢出C:> more stack_recursive.c/* * Infinite recursive calls will lead to stack overflow soon. */#include static void foo(void);static void bar(void);int main(int argc, char *argv[]){ foo(); return 0;}static void foo(void){ bar();}static void bar(void){ foo();}C:> cl stack_recursive.cMicrosoft (R) 32bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86Copyright (C) Microsoft Corporation. All rights reserved.stack_recursive.cMicrosoft (R) Incremental Linker Version 8.00.50727.42Copyright (C) Microsoft Corporation. All rights reserved./out:stack_recursive.exestack_recursive.objC:> stack_recursive該程序沒聲沒息就結束了。

9、查看進程返回值能發(fā)現(xiàn)它其實是異常終止了。

10、只不過沒有像 stack_local 那樣彈出一個對話框。

11、C:> echo %errorlevel%1073741819 要搞清楚這兩個程序為什么有這點細微的區(qū)別,可以查閱一下二者的匯編代碼。

12、原來是 _chkstk() 在起作用,其中 stack_local 在程序初始加載時就會導致 _chkstk() 失敗,觸發(fā)異常。

13、而 stack_recursive 可以正確加載,并運行一段時間,然后導致棧溢出,并觸發(fā)異常。

14、 要正確處理棧溢出采用以下辦法:(1)修正我們的程序,不要造成無窮遞歸或太深的遞歸。

15、我們可以把某些遞歸代碼非遞歸化,例如那個經(jīng)典的 qsort ,最好就用非遞歸的算法來實現(xiàn),就比較皮實一點。

16、(2)修正我們的程序,不要定義過大的局部變量,特別是在定義大結構、大數(shù)組時要格外小心。

17、有時我們可能會用 _alloca() 這樣的特殊函數(shù)直接在棧上分配空間,更要多加注意。

18、(3)利用編譯器的特性,將進程允許的棧大小設置得大一些。

19、例如可以采用 MSC 中的 /STACK 參數(shù)開關。

20、(4)對于那些還可能導致棧溢出的代碼,采用 Microsoft 的結構化異常處理或標準的 C++ 異常處理機制,結合 _resetstkoflw() 進行處理。

21、當然了,要是不嫌麻煩,我們也可以自己探測所用棧的大小,動態(tài)地檢測是否可能導致棧溢出,以避免可能的異常。

本文就為大家分享到這里,希望小伙伴們會喜歡。

以上就是小編對于stckoverflow怎么進去(stckoverflow)問題和相關問題的解答了,stckoverflow怎么進去(stckoverflow)的問題希望對你有用!

總結

以上是生活随笔為你收集整理的stckoverflow怎么进去(stckoverflow)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。