我对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错误*/。
同时,用len-1更改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
,依此类推