解决报错Process finished with exit code -1073741571 (0xC00000FD),修改栈大小
程序员文章站
2022-03-10 16:09:16
...
运行程序时程序意外终止,并返回提示:
Process finished with exit code -1073741571 (0xC00000FD)
导致的原因是*(栈区溢出)
在一般情况下, 不同平台默认栈大小如下(仅供参考)
SunOS/Solaris 8172K bytes (Shared Version)
Linux 10240K bytes
Windows 1024K bytes (Release Version)
AIX 65536K bytes
解决方法(一):
如果是由于递归调用导致栈溢出,可通过尾递归优化。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。
# 示例
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中设置堆栈大小的方法:
- 选择 “项目->属性”.
- 选择 “链接器”.
- 选择 “系统”.
- 在 "堆栈保留大小"中输栈的大小
上一篇: 小程序实现简单列表功能
下一篇: Docker容器如何使用