运行程序时程序意外终止,并返回提示:
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中修改堆栈大小的方法:
2、Dev-C++中设置堆栈大小的方法:
只需要在连接器命令行加入命令:
-Wl,--stack=SIZE //SIZE为空间大小,64MB 记作 64∗1024∗1024=67108864
3、在VS中设置堆栈大小的方法: