我对C很新,所以这个问题可能很愚蠢,但我真的不明白为什么递归函数给我分段错误,而另一个(只有一个参数改变了),什么也没给我。 所以,这些是函数,用于计算“ vette ”(源代码中的变量名称)的数量,这个数字大于数组中所有其他连续数字(不包括最后一个数字) )。
这是非工作:
#include <stdio.h>
#include <stdlib.h>
#define N 6
int vette(int *a, int len, int lentot) {
/* end of the array */
if (lentot<=1) return 0;
/* checked if the element is a vetta*/
if (len == 1) {
return 1 + vette(&a[1], lentot-1, lentot-1);
}
/* checking */
if (*a>a[len-1])
return vette(a, lentot-1, lentot); /* this line gives me seg fault */
else
return vette(&a[1], lentot-1, lentot-1);
}
/*trying the function*/
int main() {
int a[6]={10,9,4,5,7,6};
printf("%d", vette(a,N,N));
}
如您所见,我使用len和lentot作为参数来导航到函数。但是,由于某种原因我不明白,这个函数给我一个错误,我写了“/ *这行给了我一个错误* /。
同时,用len-1改变lentot-1的变量,在那一刻具有相同的值并且不会改变lentot的值,因为它在参数 int len ,所以什么都不应该发生,但我的代码开始完美运行。 代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 6
int vette(int *a, int len, int lentot) {
/* end of the array */
if (lentot<=1) return 0;
/* checked if the element is a vetta*/
if (len == 1) {
return 1 + vette(&a[1], lentot-1, lentot-1);
}
/* checking */
if (*a>a[len-1])
return vette(a, len-1, lentot);
else
return vette(&a[1], lentot-1, lentot-1);
}
/*trying the function*/
int main() {
int a[6]={10,9,4,5,7,6};
printf("%d", vette(a,N,N));
}
我真的很感激理解为什么这段代码会给我这个错误,非常感谢!
答案 0 :(得分:0)
由于堆栈溢出(无双关语),这会给您带来分段错误。你的递归永远不会结束。第二个参数lentot-1
不会减少。当您将其更改为len-1
时,确实如此。
从主程序开始,在第一次递归调用len = lentot = 6
中。然后,在被控行len = 5
和lentot = 6
的第二次递归调用中。问题是,在第三个问题中,它仍然是len = 5
和lentot = 6
,依此类推。