【发布时间】:2014-07-14 01:05:04
【问题描述】:
已解决:段错误是由无限(嗯,实际上无限)递归引起的。当我忘记考虑案例b = 0 时,无限递归发生在我的uint pow(uint a, uint b) 函数及其辅助函数中。当b = 0 时,b 将减少,将其环绕到unsigned int 限制,然后继续添加堆栈直到b 回到 1。
感谢@chris 帮助调试,感谢@vsoftco 建议无限递归。
我对 C++ 还是很陌生。我正在编写一个程序,它有 4 个函数,其中 3 个是递归的(我怀疑递归函数与这个问题有关)。
基本上,我知道当我进入以下代码行时遇到了段错误:
uint right = (n % pow(10, i)) / pow(10, i - 1);
此代码在我的 bool isPalindrome(uint) 函数的 for 循环中。这是我掌握的与段错误有关的唯一信息。
我尝试在 stackoverflow 和 google 上查找段错误示例,但我找不到任何 不 与指针和类似内容有关的示例。
这里出了什么问题?任何和所有的帮助将不胜感激。另外,请解释您提出的任何建议,因为我对 C++ 还很陌生,并且打算尽可能多地学习。完整的源代码如下,我认为它对于这个问题是无价的。
/*
* AUTHORS: Thomas D. Fischer (a.k.a. gragas)
* CREATION DATE: ----:--:-- (YY:MM:DD)
*/
#include <iostream>
#include <time.h>
using namespace std;
typedef unsigned int uint;
bool isPalindrome(uint);
uint length(uint, uint count = 0);
uint pow(uint, uint);
uint powhelper(uint, uint, uint);
int main()
{
clock_t start_time = clock();
cout << "Running program..." << endl;
cout << isPalindrome(12) << endl;
cout << "Execution Time: " << double(clock() - start_time)/CLOCKS_PER_SEC;
}
bool isPalindrome(uint n)
{
for(uint i = 1; i <= length(n)/2; i++)
{
uint left = (n / pow(10, length(n) - i)) % 10;
uint right = (n % pow(10, i)) / pow(10, i - 1);
if( left != right )
return false;
}
return true;
}
uint length(uint n, uint count)
{
if(n != 0)
return length(n /= 10, ++count);
else
return count;
}
uint pow(uint a, uint b)
{
if(b != 1)
return powhelper(a*a, --b, a);
else
return a;
}
uint powhelper(uint a, uint b, uint multiplier)
{
if(b != 1)
return powhelper(a*multiplier, --b, multiplier);
else
return a;
}
【问题讨论】:
-
哪一行给出了段错误?相关变量有什么值?使用调试器。
-
你可能在某处有无限递归(因此堆栈实际上溢出了),使用调试器看看发生了什么。
-
@chris 我发现了给我段错误的特定行。帖子已更新。
-
@chris 和 @vsoftco ,我发现了问题。 @vsoftco 你是对的,我没有考虑到我的
uint pow(uint a, uint b)函数将 0 作为第二个参数 b。这会导致无限递归,因为递归在 b 达到 1 时停止,但是 b 从 0 开始并且仅减少,它永远不会达到 1。感谢你们俩帮助我解决了这个问题。 -
递归实际上并不是无限的,只是非常大。
标签: c++ recursion segmentation-fault