为什么会出现分段错误?我究竟做错了什么?

Why am I getting a segmentation fault? What am I doing wrong?

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

我所做的:我已经尝试了所有我知道的方法,我使用了一个输出数组来存储数字的索引,并且只是 ++ 到另一个数字以找到与当前数字的匹配。似乎没有任何效果,这是一个或另一个错误(我是菜鸟)。我试着在网上寻找解决方案,在 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”的分段错误。抱歉。

这段代码中有不少错误:

  • j 未初始化,即使未初始化,您也没有正确使用 j 的值。
  • ind() 的递归调用中缺少 returnre 应该是什么?)。
  • 您正在将 asize 原始 值传递给递归 ind(),导致无限循环。您正在使用 post-递增和 post-递减运算符,return 原始值,而不是新值。您需要改用预递增和预递减运算符。在这种情况下这有点矫枉过正,因为在调整变量后您不再使用它们。所以可以用简单的加减运算符代替。
  • main() 忽略 ind() 的 return 值。

试试这个:

#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);
}