【问题标题】:How can I get a stack overflow in C++ and Unix?如何在 C++ 和 Unix 中获得堆栈溢出?
【发布时间】:2011-12-05 18:13:55
【问题描述】:

我想知道如何通过一个简单的例子来获取堆栈溢出错误,例如:

int recursSum (int n)
{
   return (n==1)? 1:n+recursSum(n-1);
}

我问这个愚蠢的问题是因为我只有一些分段错误,即使有一个空函数调用自己......

我是否遗漏了什么,或者是否有任何保护或阻止我这样做的东西?

【问题讨论】:

标签: c++ unix


【解决方案1】:

分段错误意味着内存保护启动并阻止您访问您没有可用的内存。 variety of reasons 可能会发生这种情况,但指出的一个原因是堆栈溢出(堆栈溢出到其他内存段)。

【讨论】:

    【解决方案2】:

    如果使用负数或 0 整数参数调用函数,您将面临无限递归。但是,编译器可能可以尾调用优化该特定函数,并且您永远不会看到堆栈溢出,除非在调试模式下。分段错误在其他地方。

    【讨论】:

    • 是的,智能编译器可能会将其优化为无限循环。但是,如果没有(例如,因为 OP 没有传递适当的 -O 标志),给定的代码在使用负数或零参数调用时将导致堆栈溢出,这将导致分段错误(也会导致分段错误) OP 也尝试过的调用自身的空函数)。所以我不明白你为什么认为分段错误一定存在于其他地方。
    【解决方案3】:

    堆栈溢出是一种分段错误,看起来您的系统刚刚输出了一般错误。

    您可以在这里阅读更多内容:http://en.wikipedia.org/wiki/Segmentation_fault

    【讨论】:

      【解决方案4】:
      Foo()
      
      {
      
          float f[1024];
      
          Foo();
      
      }
      

      f 是一个虚拟变量,有助于快速填充堆栈。

      【讨论】:

      • 您可能想以某种方式使用它,否则优化器可能会完全删除该数组。
      • 在这种函数(和原始问题)中,编译器有可能消除递归,具体取决于优化级别等。
      猜你喜欢
      • 2012-09-18
      • 2012-12-20
      • 2011-03-02
      • 2014-01-17
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多