解決報錯Process finished with exit code -1073741571 (0xC00000FD),修改棧大小

運行程序時程序意外終止,並返回提示:
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中修改堆棧大小的方法:

  1. 選擇 “Project->Setting”.
  2. 選擇 “Link”.
  3. 選擇 "Category"中的 “Output”.
  4. 在 "Stack allocations"中的"Reserve:"中輸棧的大小

2、Dev-C++中設置堆棧大小的方法:

只需要在連接器命令行加入命令:

-Wl,--stack=SIZE //SIZE爲空間大小,64MB 記作 64∗1024∗1024=67108864

3、在VS中設置堆棧大小的方法:

  1. 選擇 “項目->屬性”.
  2. 選擇 “鏈接器”.
  3. 選擇 “系統”.
  4. 在 "堆棧保留大小"中輸棧的大小
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章