为什么它会给出分段错误的错误(核心转储)并且在第一种情况下没有输出?有人能用参数解释程序是如何主要递归的吗?
#include <stdio.h>
int main()
{
static int i = 2;
if (i<7)
{
main();
printf("%d ", i);
i++;
//main(10);
}
}
-
#include <stdio.h>
int main()
{
static int i = 5;
if (--i)
{
//main();
printf("%d ", i);
main(10);
}
}
答案 0 :(得分:3)
您先调用main()
,然后递增i
if (i<7)
{
main(); // <-- main called when i still 2
printf("%d ", i);
i++; // <-- statement never reached
//main(10);
}
因此,当main()
递归调用main()
时,永远不会达到语句i++
。
在致电i
main()
if (i<7)
{
i++;
main();
printf("%d ", i);
//main(10);
}
答案 1 :(得分:1)
TL; DR StackOverflow ( Pun或者没有双关语,两种方式都是)。
首先: 一些重要信息
此案例与将参数传递给main()
无关。实际上,根据最新的C标准C11
,对于托管环境,main()
的符合签名为int main(void)
,然后main(10);
完全错误。< / p>
现在,来到这里的实际问题,
在第一种情况下,在{/ 1}}调用之后,i
值的更改发生,因此实际上,main()
的值从未发生过因为控件永远不会到达修改i
的语句而被更改。因此,它是一个无限循环,并且由于对i
的递归调用,会发生堆栈溢出。
在稍后的情况下,main()
值会在调用i
之前更新,以便该值实际反映出来。因此,在某些时候(实际发生4次之后),main()
条件满足FALSE条件,递归调用结束,堆栈展开。
答案 2 :(得分:1)
第一种情况是调用main()之后的i ++,这意味着程序没有机会添加i,进入无限循环和stackoverflow!哈哈....
但第二种情况是,在你打电话给主要人员之前,它会减少i。
答案 3 :(得分:1)
第一种情况:
调用i++
后, main
会定位。所以i
总是等于2,因为你永远不会达到代码的这一部分。然后,您每次调用main
函数,导致无限递归,从而导致分段错误。这种情况的解决方法是在调用main函数之前增加i。
if (i<7)
{
i++; // Increment before calling the main function, so i value is changed
main();
printf("%d ", i);
}
注意它会导致看起来像你的第二种情况,除了你会打印几个“7”。
Seconde案例:
在第二种情况下,每次输入if条件时,您都会减少i
的值。当您最终无法再输入if条件时,表示i
等于0(因为if(0)
等同于if(false)
)。每当您返回上一个被调用的main函数时,i
仍然等于0,解释了每次显示“0”的原因。如果要打印不同的值,可以在调用main函数之前放置printf
。
答案 4 :(得分:0)
在第一种情况下:
&#34; I&#34;永远不会增加,因此你在无限循环中运行并获得溢出。
在第二种情况下:
在显示&#34; i&#34;的值之前调用递归,在四次调用之后&#34; i&#34;等于0,你的递归堆栈展开。
在递归调用之前修改条件并执行输出。
答案 5 :(得分:0)
在第一种情况下,我永远不会增加,因此,主要不断被调用,很快就没有更多的堆栈内存可用于该程序。
在第二种情况下,i的最后更新值在i的整个生命周期中都是完整的。由于我是静态的,程序在所有迭代中都指的是相同的内存地址。打印时,您会看到上次更新的值,即0,作为输出。