【问题标题】:C - Segmentation fault with recursionC - 递归分段错误
【发布时间】:2017-06-05 23:02:15
【问题描述】:

我对 C 很陌生,所以这个问题可能很愚蠢,但我真的不明白为什么 recursive 函数给了我 segmentation fault,而另一个 (只改变了一个参数),什么也没给我。 所以,这些是函数,用于计算“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 作为参数来导航到该函数。但是,由于某种我不明白的原因,该函数给了我一个错误,我写了“/*这行给了我段错误*/。

同时将lentot-1的变量改成len-1,此时的值相同,不会改变lentot的值,因为在参数int len em>,所以什么都不会发生,但我的代码开始完美运行。 代码如下:

#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));
}

非常感谢理解为什么这段代码给我这个错误,非常感谢提前!

【问题讨论】:

  • 输入函数时打印变量的值。这应该会立即告诉您正在发生的事情。
  • @dbush 非常感谢您的建议:结果是工作中的正确值,但在非工作中存在递归函数的循环。 lentot 始终为 5,len 始终为 6。我不明白为什么,因为即使在递归函数的一个步骤中,一个 len 是 6 而 lentot 是 5!
  • 对不起,我在问题的开头写了它,但如果有不清楚的地方,请告诉我! “所以,这些是函数,用于计算“vette”(我的源代码中的变量名称)的数量,这个数字大于数组中所有其他连续数字(不包括最后一个)。因此,例如,{4,6,1,2} 有 1 个“vette”,即 6,因为它大于每个连续的数字。我只需要“vette”的数量!

标签: c recursion segmentation-fault


【解决方案1】:

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

从你的主程序开始,在第一个递归调用len = lentot = 6。然后,在来自被告行的第二个递归调用中,len = 5lentot = 6。问题是第三个还是len = 5lentot = 6,以此类推。

【讨论】:

  • 对不起,我不明白为什么。在len的“地方”给出函数lentot -1,不等于给出len吗?那么,lentot - 1 不会成为被调用函数中的新 len 吗?编辑:了解;我每次都通过相同的变量。非常感谢!
  • 我添加了更多解释。如果遇到这样的问题,您真的应该使用调试器或printf 来跟踪变量的值。
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2019-05-26
相关资源
最近更新 更多