運行程序時程序意外終止,並返回提示:
Process finished with exit code -1073741571 (0xC00000FD)
導致的原因是StackOverflow(棧區溢出)
在一般情況下, 不同平臺默認棧大小如下(僅供參考)
SunOS/Solaris 8172K bytes (Shared Version)
Linux 10240K bytes
Windows 1024K bytes (Release Version)
AIX 65536K bytes
解決方法(一):
如果是由於遞歸調用導致棧溢出,可通過尾遞歸優化。
尾遞歸是指,在函數返回的時候,調用自身本身,並且,return語句不能包含表達式。這樣,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次,都只佔用一個棧幀,不會出現棧溢出的情況。
爲什麼遞歸調用會導致溢出呢?
遞歸調用是函數調用自己,在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。
爲什麼尾遞歸不會導致棧溢出?
事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。尾遞歸調用時,如果做了優化,棧不會增長,因此,無論多少次調用也不會導致棧溢出。
# 示例
def fact(n):
return fact_iter(1, 1, n)
def fact_iter(product, count, max):
if count > max:
return product
return fact_iter(product * count, count + 1, max)
遺憾的是,大多數編程語言沒有針對尾遞歸做優化,Python解釋器也沒有做優化,所以,即使把上面的fact(n)函數改成尾遞歸方式,也會導致棧溢出。
如果需要,建議可以去網上看看優化尾遞歸的裝飾器代碼。
解決方法(二):
修改代碼,將較大的局部變量修改爲全局變量。
解決問題的原理:全局變量和局部變量存儲方式的區別:全局變量存儲在全局數據區中,而局部變量存儲在棧區中。因此,將大的局部變量改爲全局變量,就有可能解決棧區溢出的問題。
# 示例
# 原始函數
def attack_Q(sex=Ture,*args.**kwargs):
name = '李志鵬' # 定義name爲一個局部變量
blood = '10000' # 定義blood爲一個局部變量
# 修改後
def attack_Q(sex=Ture,*args.**kwargs):
global name = '李志鵬' # 定義name爲一個全局變量
global blood = '10000' # 定義blood爲一個全局變量
解決方法(三):
修改棧內存分配。
1、VC6.0中修改堆棧大小的方法:
- 選擇 “Project->Setting”.
- 選擇 “Link”.
- 選擇 "Category"中的 “Output”.
- 在 "Stack allocations"中的"Reserve:"中輸棧的大小
2、Dev-C++中設置堆棧大小的方法:
只需要在連接器命令行加入命令:
-Wl,--stack=SIZE //SIZE爲空間大小,64MB 記作 64∗1024∗1024=67108864
3、在VS中設置堆棧大小的方法:
- 選擇 “項目->屬性”.
- 選擇 “鏈接器”.
- 選擇 “系統”.
- 在 "堆棧保留大小"中輸棧的大小