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

选择 “Project->Setting”.

选择 “Link”.

选择 "Category"中的 “Output”.

在 "Stack allocations"中的"Reserve:"中输栈的大小

2、Dev-C++中设置堆栈大小的方法:

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

-Wl,--stack=SIZE //SIZE为空间大小,64MB 记作 64∗1024∗1024=67108864

3、在VS中设置堆栈大小的方法:

  1. 选择 “项目->属性”.
  2. 选择 “链接器”.
  3. 选择 “系统”.
  4. 在 "堆栈保留大小"中输栈的大小