#include<stdio.h>
void f(void)
{
int s = 0;
s++;
if(s == 10)
return;
f();
printf("%d ", s);
}
int main(void)
{
f();
}
程序的输出是什么!?? 我是分段错误......它是什么?
答案 0 :(得分:6)
由于s
是一个局部变量,因此每次递归调用f()
都会得到它自己的副本。因此每次s
为1时,您都会遇到堆栈溢出异常。
答案 1 :(得分:4)
这里的问题是你没有静态初始化s
。因此,每次拨打f()
时,始终都会从0开始,并且f()
一直反复调用自己,但永远不会遇到if(s == 10)
。调用堆栈最终溢出并繁荣,分段错误。
答案 2 :(得分:2)
问题是你递归地调用f
,而不是每次都改变任何东西。你可能正在堆栈溢出。
每次拨打f
时,都会将s
初始化为0
并将其递增。它永远不会达到10。
您应该做的是s
参数f
或者s
静态。
答案 3 :(得分:1)
你的程序是一个无限循环;你得到了分段错误,因为你最终会溢出你的堆栈。
答案 4 :(得分:1)
程序进入无限循环。 原因是: s是f()的局部,所以每当调用f()时,s被初始化为0.然后它增加1,&amp;再次调用f()。这一次,f()使用其本地副本&amp;将s初始化为0&amp;再次递归调用f()。这会产生一个无限循环&amp;程序生成分段错误。由于递归无限调用,seg错误的原因是堆栈溢出。 要解决这个问题,要么是静态的,要么是全局的,而不是本地的。
答案 5 :(得分:0)
如何使变量静止?
答案 6 :(得分:0)
这是一个自我调用的递归函数。但是,它是一个无限循环,因为int s = 0;
每次调用时都会重置计数器。它将打印出无穷无尽的0行。
样本解决方案:
int main (void) {
f(0);
}
void f (int s) {
if (s == 10)
return;
printf("%d ", s);
f(s++);
}
我对C语法不太满意,但这个想法很合理。
答案 7 :(得分:0)
无限循环。这可能类似于你想要的东西
#include<stdio.h>
void f(int s)
{
s++;
if(s == 10)
return;
f(s);
printf("%d ", s);
}
int main(void)
{
f(0);
}
答案 8 :(得分:0)
这可能是一个更有趣的计划:
void f(int s)
{
s++;
if(s == 10)
return;
f(s);
printf("%d ", s);
}
int main(void)
{
f(0);
}
那将打印:
9 8 7 6 5 4 3 2 1
答案 9 :(得分:0)
此程序的输出是此站点的名称。
正如其他人所建议您应将s
声明为static int s = 0