0

为什么会出现分段错误?我想找到一个数字的所有因素并将它们放在一个向量中。我有另一个函数可以做同样的事情,只是它使用了一个while循环。所以我想我会尝试递归。“i”最初从 1 开始,除非我在 main.cpp 中添加了一些其他值。“cout i”行就在那里,所以我可以看到它失败的地方。

void recurfact ( std::vector <int> & facts, int numb, int i ) 
{
  std::cout << i << std::endl;
  if ( i  > numb )
    {
      return;
    }

  if ( numb % i == 0 )
    {
      facts.push_back(i);
      i = i + 1;
      recurfact ( facts, numb, i );
    }
  else
    {
      i = i + 1;
      recurfact ( facts, numb, i );
    }
}

因此,如果我用小于 42800 +/- 100 的数字对其进行测试,则此方法有效。如果我尝试任何大于该数字的数字,它就会停止。调试器说存在分段错误。如果我注释掉 push_back 行,它仍然会在 i 值处崩溃。

但是,如果我从 i = 45000 开始,我可以毫无问题地测试从 45000 到 85000 的数字。高于 85000 就会崩溃。

我想知道为什么会这样。

在 Windows 7 上的 cygwin 中使用 gcc 进行编译。

来自 gdb 的错误消息是:

程序收到信号 SIGSEGV,分段错误。/cygdrive/c/Windows/system32/KERNELBASE.dll 中的 WaitForSingleObjectEx () 中的 0x000007fefcec10d6

4

1 回答 1

0

请参阅有关 Unix 类型系统上的分段错误的文档:

http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

在类 Unix 系统下,程序可能会抛出“Segmentation Fault”错误。这可能是由于堆栈溢出,特别是来自递归函数调用或庞大的数据集。在我们的演示程序“Pi”(参见“$(CORE_PATH)/progs/pi”)中,我们将 Pi 计算为任意数量的所需位或数字。以下是使用默认堆栈大小在不同平台上何时发生堆栈溢出的一些测试结果。

于 2013-10-26T13:29:51.077 回答