猴塞雷

科学观察员
科学赐予人类相信真理的力量

如何解决堆栈溢出

堆栈

堆栈是计算机科学中经常使用的抽象数据类型。堆栈中的对象具有一个功能:总是首先取出装入堆栈中的最后一个对象。此功能通常称为后进先出(LIFO)队列。一些操作在堆栈中定义。最重要的两个是PUSH和POP。 PUSH操作将一个元素添加到堆栈的底部。 POP操作与此相反,它从堆栈的底部删除了一个元素,并将堆栈的大小减小了一个。

堆栈溢出

堆栈溢出的形成是由于函数调用过多,这使得调用堆栈很难容纳那些调用的返回地址,而这些地址通常是递归形成的。堆栈溢出很可能是由无限递归引起的,但也可能是太多的堆栈级别。

堆栈溢出意味着,无论在堆栈上分配的本地数据块的大小如何,都会有太多数据写入数据块,从而导致数据越过边界,结果金蝶堆栈空间溢出,其他数据将被覆盖。可以理解为将一段代码嵌入一个长字符串中,并用该段代码的地址覆盖该过程的返回地址,以便当该过程返回时,程序将开始执行该自编译的代码代码。

例如,以下程序:

#include《 stdio.h》

如何解决堆栈溢出

}

编译执行,输入ipxodiAAAAAAAAAAAAAAAAAAA,执行gets(name)后,堆栈如下:

内存顶部内存底部

名称EBP ret

” --------- [ipxodiAA] [AAAA] [AAAA] .............

^&name

堆栈底部堆栈顶部

如何解决堆栈溢出

reserve:堆栈的大小; commit:一个选项金蝶堆栈空间溢出,与操作系统有关,物理内存的大小仅在NT上分配一次

方法3:设置Visual Stdio的/ STACK大小

1 VC 6. 0更改:

打开项目并按如下所示操作菜单:Project-“ SetTIng-” Link,在Category中选择Output,然后设置最大堆栈大小并提交Reserve。

注:保留区的默认值为1MB,最小值为4Byte;默认值为1MB。提交保留在虚拟内存的页面文件上。较大的设置会将堆栈打开到较大的值,这可能会减少视频内存的成本和启动时间。

2 VS2008的更改

在Visual Studio开发环境中设置此链接器链接器选项

如何解决堆栈溢出

猴塞雷 版权所有,未经允许不得转载:猴塞雷 » 如何解决堆栈溢出
分享到: 更多 (0)

猜你也想读下面的文章: