C - 带递归的分段错误

时间:2017-01-20 21:13:10

标签: c recursion segmentation-fault

我对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));
}

我真的很感激理解为什么这段代码会给我这个错误,非常感谢!

1 个答案:

答案 0 :(得分:0)

由于堆栈溢出(无双关语),这会给您带来分段错误。你的递归永远不会结束。第二个参数lentot-1不会减少。当您将其更改为len-1时,确实如此。

从主程序开始,在第一次递归调用len = lentot = 6中。然后,在被控行len = 5lentot = 6的第二次递归调用中。问题是,在第三个问题中,它仍然是len = 5lentot = 6,依此类推。