【问题标题】:Recursive function occasionally returns a segmentation fault递归函数偶尔会返回分段错误
【发布时间】:2017-02-02 13:57:17
【问题描述】:

我正在努力实现一种分而治之的算法,该算法可以找到彼此最接近的两个点以及它们之间的距离。我的最终解决方案找到了正确的答案(与使用蛮力相比),但大约 1/3 的时间会返回分段错误错误。几天来我一直在努力解决这个问题,在这里和那里添加打印语句,但找不到问题。如果有人查看我的代码,我将不胜感激。

【问题讨论】:

  • 你的调试器把分段错误放在哪里了?
  • 每次使用相同的输入数据还是不同的数据?鉴于该函数是递归的,您可能会用完堆栈空间。尝试增加堆栈正在重新运行导致程序崩溃的数据。
  • @Cedric 刚刚尝试了一个调试器,它说在for (j=i+1; j<n && (Yprime[j].y-Yprime[i].y) < minSoFar; j++) { 发生了分段错误。 @iksemyonov 我使用随机生成的点作为输入。我尝试保持输入大小和种子不变,但分段错误仍然非常随机地发生。
  • 另外,增加堆栈大小并没有帮助(无论如何我都在用 N
  • @Lorehead 如果您在谈论 1201ProgramAlarm 的答案,OP 已经评论过它,说它不起作用。无论如何,由于他是在受控环境中测试此代码,因此 X

标签: c++ recursion divide-and-conquer


【解决方案1】:

您的“除法”循环假定XY 具有相同数量的元素。如果Y 少于X,您将遇到未定义的行为,这可能是有趣的结果或崩溃。

【讨论】:

  • 也许可以提出解决方案?只需替换几行,它们的注释替换(为什么必要)
  • 这是有道理的。我尝试将循环分成两个:一个用于Y,条件为i<Y.size(),另一个用于X,条件为i<n,但我仍然遇到分段错误。还有其他想法吗?
【解决方案2】:

尝试更改向量的访问方法。向量下标运算符在某些编译器/平台中似乎确实有一种古怪的行为(至少从我的角度来看)。 我认为问题出在它是一个链表,导致在内存中不连续,但这只是一个猜测。(编辑:std::vector 在内存中是连续的,问题出在else) 尝试使用迭代器(easy-peasy with auto 关键字),例如:

for (auto iter = Yprime.begin(); iter != Yprime.end(); iter++) {
    // Your code here
}

希望这适用于您的情况!

【讨论】:

  • 刚刚编辑了我的帖子,之后看到了你的评论。对于那个很抱歉。虽然,我明确表示“但这只是猜测”。所以你说我完全错了有点不对。试试吧,在 LLVM 上使用下标运算符时出现分段错误。
  • 感谢您的建议。我花了一段时间以这种方式重新实现我的代码。尽管如此,我仍然遇到同样的错误......
  • 很抱歉听到这个消息......我曾经遇到过类似的问题,它确实解决了......否则,我看到的唯一另一件事是声明 abs(Y[i].x - mid.x) < D.dsq 至少有一次是错误的,使Yprime 的大小小于n
猜你喜欢
  • 2021-06-18
  • 2022-01-12
  • 2015-02-08
  • 2013-04-24
  • 1970-01-01
  • 2017-10-27
  • 2020-12-24
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多