是否可以估计调用函数在堆栈中需要的大小?

时间:2010-09-21 15:10:54

标签: c visual-studio

我试图从另一个程序员那里理解一个C代码。有时我会遇到分段错误,我认为这可能是由于堆栈溢出造成的。我想知道在Visual Studio(或其他方式)中是否可以通过调用函数来简单地估计创建变量时堆栈所需的大小。

由于

3 个答案:

答案 0 :(得分:1)

堆栈中帧的大小大致是传入的参数大小加上局部变量大小之和的总和。还有一些额外的返回地址,基指针,也许还有一些保护cookie用于检查堆栈溢出。

示例:

int foo(int x, int y, char *string) {
  int array[10000];
  // ...
}

VC ++中的整数各4个字节。指针是32位可执行文件中的4个字节,或64位可执行文件中的8个字节。因此参数加起来为4 + 4 + 8。本地数组是40,000个字节。此功能消耗大约40 KB的堆栈。在超出堆栈之前,你可以添加很多这些。

Windows程序中的实际堆栈溢出通常仅在失控递归时发生。默认堆栈大小非常大(1 MB)。您可以通过覆盖堆栈上的缓冲区来获取堆栈损坏。

您的崩溃可能与访问超出其边界的数组或通过未指向有效内存的指针(例如,NULL指针)进行访问有关。

答案 1 :(得分:0)

您可以通过将局部变量的大小和_alloca()调用中使用的大小相加来估算函数使用的堆栈大小。
这只是一个估计,并且通常会比实际的堆栈使用量大一点,但是如果你正在处理堆栈溢出,它应该足够了。

另一方面,根据编译器设置,堆栈的大小将为几千字节,甚至可能根据需要增长。
如果在崩溃时,在callstack上确实只有少量,小到中等大小的帧,则更有可能是指针访问或数组索引存在问题。一定要检查你的程序没有覆盖随机内存的野指针。

答案 2 :(得分:0)

我认为这里更好的方法是确定堆栈溢出异常是否实际导致问题。如果发生堆栈溢出,Visual Studio中有一个设置会导致它中断。设置它,在调试器下运行程序,你就会知道堆栈溢出是否是问题。

  • 调试 - >例外
  • 展开Win32例外
  • 检查“Stack Overflow”抛出

alt text