我对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 = 5lentot = 6。问题是在第三个中,它仍然是len = 5lentot = 6,依此类推。

07-25 21:53