【问题标题】:Why am I getting a segmentation fault? What am I doing wrong?为什么会出现分段错误?我究竟做错了什么?
【发布时间】:2021-03-05 14:11:42
【问题描述】:

问题:一个使用递归计算数组中数字重复次数的程序。

我所做的:我已经尝试了所有我知道的方法,我已经使用了一个输出数组来存储数字的索引,并且只需 ++ 到另一个数字以找到与当前数字匹配的数字。似乎没有任何效果,这是一个错误或另一个错误(我是菜鸟)。我尝试在网上寻找解决方案,在 3-4 个网站上找到了解决方案,但不知道发生了什么。

代码如下:

#include <iostream>
using namespace std;
int ind(int a[], int size, int x){
    int j;
    if(size == 0){
        return 0;}
    else if (a[0]==x){
        j++;
        return j;
    }
    reind(a++,size—,x);
}
int main(){
    int a[5] = {1,2,3,3,5};
    ind(a, 5, 3);
}

编辑:那个“reind”是一个错字,我仍然得到“ind”的分段错误。很抱歉。

【问题讨论】:

  • 将代码作为文本包含在问题正文中,而不是图像
  • int j; j++; 通过访问未初始化的变量表现出未定义的行为。
  • ind 通过到达非void 函数的右大括号而不遇到return 语句来表现出未定义的行为。
  • 注意编译器警告。你应该有几个。不要忽视它们。

标签: c++ recursion segmentation-fault


【解决方案1】:

这段代码有不少错误:

  • j 未初始化,即使未初始化,您也没有正确使用 j 的值。
  • 在对ind() 的递归调用中缺少return(这就是re 应该的样子吗?)。
  • 您正在将asize原始 值传递给递归ind(),从而导致无限循环。您正在使用 post-increment 和 post-decrement 运算符,它们返回原始值,而不是新值。您将需要使用预递增和预递减运算符。在这种情况下这有点矫枉过正,因为在调整变量后您不再使用这些变量。因此可以使用简单的加法和减法运算符。
  • main() 忽略了ind() 的返回值。

试试这个:

#include <iostream>
using namespace std;

int ind(int a[], int size, int x){
    int j = 0;
    if (size == 0){
        return 0;
    }
    if (a[0] == x){
        ++j;
    }
    return j + ind(a+1, size-1, x);
}

int main(){
    int a[5] = {1, 2, 3, 3, 5};
    cout << ind(a, 5, 3);
}

Live Demo

话虽如此,j 和第二个if 可以完全消除:

int ind(int a[], int size, int x){
    if (size == 0){
        return 0;
    }
    return (a[0] == x ? 1 : 0) + ind(a+1, size-1, x);
}

或者:

int ind(int a[], int size, int x){
    if (size == 0){
        return 0;
    }
    return int(a[0] == x) + ind(a+1, size-1, x);
}

【讨论】:

  • 但是我在第一行初始化了 j。
  • 在您看来,jint j; 行之后有什么价值?
  • @RohitMalik 不,你声明了 j,但你没有初始化它的值。
  • 哦,是的,我是个笨蛋,它会有一个随机值。但即使用 0 初始化它,我也会遇到段错误。
  • 非常感谢您帮助我。真的,非常感谢。
猜你喜欢
  • 2013-08-06
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2022-06-10
  • 2011-04-30
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多