为什么会出现分段错误?我究竟做错了什么?
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()
的递归调用中缺少 return
(re
应该是什么?)。
- 您正在将
a
和 size
的 原始 值传递给递归 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);
}
也就是说,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);
}
问题:一个使用递归计算数组中数字重复次数的程序。
我所做的:我已经尝试了所有我知道的方法,我使用了一个输出数组来存储数字的索引,并且只是 ++ 到另一个数字以找到与当前数字的匹配。似乎没有任何效果,这是一个或另一个错误(我是菜鸟)。我试着在网上寻找解决方案,在 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()
的递归调用中缺少return
(re
应该是什么?)。- 您正在将
a
和size
的 原始 值传递给递归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);
}
也就是说,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);
}