【发布时间】: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