我对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作为参数来导航到该函数。但是,由于某种我不理解的原因,该函数给了我一个错误,我写了“ / *这行给我seg fault * /。
同时,将lentot-1的变量更改为len-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));
}
非常感谢您理解为什么这段代码给了我这个错误,非常感谢!
最佳答案
由于堆栈溢出(没有双关语),这会给您带来分段错误。您的递归永远不会结束。第二个参数lentot-1
不减少。当您将其更改为len-1
时,它会。
从主程序开始,在第一个递归调用len = lentot = 6
中。然后,在来自被告行的第二次递归调用中,len = 5
和lentot = 6
。问题是在第三个中,它仍然是len = 5
和lentot = 6
,依此类推。