我在不使用指针的情况下得到"Segmentation Fault"。发生了什么事情?

I am getting "Segmentation Fault" without using pointers. What is happening?

本文关键字:Fault Segmentation 发生了 什么 指针 情况下      更新时间:2023-10-16

RESOLVED:段错误是由无限递归引起的(好吧,实际上不是无限)。无限递归发生在uint pow(uint a, uint b)函数和它的辅助函数中当我忘记考虑b = 0的情况时。当b = 0b减少时,将其缠绕到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;
}

您的pow()函数不处理b=0的情况。这发生在循环的第一次迭代(我通过插入几个调试打印输出发现)。

在这种情况下——b溢出并变成一个非常大的数字,这会导致递归溢出堆栈。

段错误来自程序的堆栈溢出。

您的pow函数不能正确处理0的指数,您在循环的第一次迭代时将其传递到相关行。你考虑过使用std::pow吗?

进一步说明,在调用powhelper时从零递减指数。这被很好地定义为模运算,所以你最终会得到一个非常大的数字,几乎肯定会导致堆栈溢出。

相关文章: