欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

解决报错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中修改堆栈大小的方法:

  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. 在 "堆栈保留大小"中输栈的大小
相关标签: python相关