为什么它会出现分割故障的错误(core倾倒(,而在第一种情况下不给出输出?谁能解释程序是如何用参数递归递归程序的程序?
#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);
}
}
您首先调用main()
,然后递增i
if (i<7)
{
main(); // <-- main called when i still 2
printf("%d ", i);
i++; // <-- statement never reached
//main(10);
}
因此,当main()
递归调用main()
时,语句i++
从未达到。
您应该在致电main()
i
if (i<7)
{
i++;
main();
printf("%d ", i);
//main(10);
}
第1个情况下呼叫后的i ,这意味着该程序没有机会添加i,然后添加到无限循环中,然后stackoverflow!哈哈....
但是第二种情况下,它是在打电话给主之前的i。
tl; dr stackoverflow ( pun或no pun,这是真的,这是真的/em>(。
首先: 一些重要信息
这种情况与将论点传递给main()
无关。实际上,根据最新的C标准C11
,对于托管环境,main()
的符合签名是int main(void)
,然后随之而来,main(10);
完全是错误的。
现在,来到这里的实际问题,
-
在第一种情况下,
i
值的更改发生在之后 呼叫main()
,因此实际上,i
的值永远不会更改,因为控件永远不会达到修改i
的陈述。因此,这是一个无限的循环,并且由于递归呼叫main()
,堆栈溢出发生了。 -
在以后的情况下,
i
值在致电main()
之前会更新,因此该值实际上反映了。因此,在某个时候(实际上发生了4次之后(,if
条件符合虚假条件,递归呼叫结束, stack Undinds。
第一种情况:
i++
在致电main
之后定位。因此,i
始终等于2,因为您永远不会达到代码的这一部分。然后,您每次都调用main
功能,导致无限递归,从而导致分割故障。这种情况的修复是在调用主函数之前增加i。
if (i<7)
{
i++; // Increment before calling the main function, so i value is changed
main();
printf("%d ", i);
}
请注意,它将导致看起来像您的第二种情况,除了您将打印几种" 7"。
第二个情况:
在第二种情况下,您每次输入IF条件时都会降低i
的值。当您最终无法再输入IF条件时,这意味着i
等于0(因为if(0)
等于if(false)
(。每次您返回上一个称为主函数时,i
仍将等于0,这说明为什么每次显示" 0"。如果要打印不同的值,则可以将printf
放置在呼叫之前,例如。
在第一种情况下:
" i"永远不会增加
在第二种情况下:
在显示" i"的值之前,您在四个呼叫" i"等于0之前调用递归
修改您的病情并在递归调用之前执行输出。
在第一种情况下,我永远不会增加,因此,主要的呼叫量很快就没有更多的堆栈内存。
在第二种情况下,i的最后更新值在i的整个生命周期内都是完整的。由于我是静态的,因此程序在所有迭代中指的是相同的内存地址。打印时,我看到了最后一个更新的值,即0,是输出。