我在不使用指针的情况下得到"Segmentation Fault"。发生了什么事情?
I am getting "Segmentation Fault" without using pointers. What is happening?
RESOLVED:段错误是由无限递归引起的(好吧,实际上不是无限)。无限递归发生在uint pow(uint a, uint b)
函数和它的辅助函数中当我忘记考虑b = 0
的情况时。当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;
}
您的pow()函数不处理b=0的情况。这发生在循环的第一次迭代(我通过插入几个调试打印输出发现)。
在这种情况下——b溢出并变成一个非常大的数字,这会导致递归溢出堆栈。
段错误来自程序的堆栈溢出。
您的pow
函数不能正确处理0
的指数,您在循环的第一次迭代时将其传递到相关行。你考虑过使用std::pow
吗?
进一步说明,在调用powhelper
时从零递减指数。这被很好地定义为模运算,所以你最终会得到一个非常大的数字,几乎肯定会导致堆栈溢出。
相关文章:
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 循环时无法进入:"Segmentation fault"
- OpenGL "Segmentation fault"错误
- 如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误
- 如何修复 C++ 中的'Segmentation fault'错误
- 创建一个简单的类及其变量和函数不断返回" segmentation fault (core dumped)"、C++
- 在 Mac OS 上遇到的"Segmentation fault: 11" [C++]
- 在 Linux 上实施英特尔 MKL 的 DFT 时"Segmentation fault"
- 尝试读取包含 ints 并存储在 int vector 中的文件,但我不断收到错误"Segmentation fault (core dumped)"
- 在非空 std::list 上使用 std::list.back<int>() 时"Segmentation Fault"
- 我正在尝试通过说话传递一些字符串,它会读取它们,但我得到了"segmentation fault"
- 为什么当我更改此代码时会给我"segmentation fault"错误?
- 尝试将文本文件加载到动态分配的 2D 数组中时出现'Segmentation fault'错误
- 将double打印到std::cout会导致Segmentation fault(C++)
- 将指针分配给链接列表节点会引发"Segmentation Fault"
- "Segmentation fault"使用 Cmake 在C++代码中运行 python 函数时
- 无法读取 Ubuntu "Segmentation fault (core dumped)"中的.dat或.bin文件
- 如何修复C++中的"Segmentation fault(core dump)"?