解决报错Process finished with exit code -1073741571 (0xC00000FD),修改栈大小
作者: cheng 发布时间: 2022-11-09 浏览: 1662 次 编辑运行程序时程序意外终止,并返回提示:
Process finished with exit code -1073741571 (0xC00000FD)
导致的原因是StackOverflow(栈区溢出)
在一般情况下, 不同平台默认栈大小如下(仅供参考)SunOS/Solaris 8172K bytes (Shared Version)Linux 10240K bytesWindows 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中设置堆栈大小的方法:
- 选择 “项目->属性”.
- 选择 “链接器”.
- 选择 “系统”.
- 在 "堆栈保留大小"中输栈的大小