答案 0 :(得分:2)
当程序试图分配一个巨大的基于堆栈的变量时,将发生堆栈溢出。当您第一次进入该函数时,程序计数器将进入该函数,但它不会执行它(包括初始化和堆栈变量分配)。但是,只要再次进入,它就会使用操作码分配堆栈变量:
sub esp, xxx; //xxx is the size of the stack variable
如果esp-xxx的结果超出了堆栈内存页面,它将抛出堆栈溢出。因为它会在你第二次进入时分配堆栈变量,所以你马上就知道你在变量声明中犯了一些错误。
解决方法是:
当您递归调用太多次时,也会发生堆栈溢出。大多数函数都需要在堆栈中进行一些临时存储。如果你尝试分配这么多次,它将超出内存。这个着名的例子是递归地调用自身以找到斐波那契序列的函数。当n超过100000时,通常会(假设堆栈大小为1MB,这是VS的默认大小)导致堆栈溢出。
唯一的解决方案是增加堆栈大小。
答案 1 :(得分:0)
我想这是因为以下行分配给堆栈上的大量内存:
BYTE bTemp[OneKilo * 1024];
尝试在堆上分配数据:
BYTE *bTemp = new Byte[OneKilo * 1024];
不要忘记随后释放内存
答案 2 :(得分:0)
_chkstk
没有建立ebp链并且正在修改堆栈帧,这可能导致调试器无法正确展开堆栈。
如果您反汇编_chkstk,您可能会找到存储返回地址的位置。在下面的示例中,它位于ecx
寄存器中。
0:000> u ntdll!_chkstk
ntdll!_chkstk:
778fad68 51 push ecx
778fad69 8d4c2404 lea ecx,[esp+4]
778fad6d 2bc8 sub ecx,eax
778fad6f 1bc0 sbb eax,eax
778fad71 f7d0 not eax
778fad73 23c8 and ecx,eax
778fad75 8bc4 mov eax,esp
778fad77 2500f0ffff and eax,0FFFFF000h
0:000>