#include <stdio.h>
main()
{
int i=5;
if(--i)
{
main();
printf("%d ",i);
}
请注意,如果我们将int i
设置为static
那么答案将是0000
。为什么这个程序成功编译但运行失败?
#include <stdio.h>
main()
{
int i=5;
if(--i)
{
main();
printf("%d ",i);
}
请注意,如果我们将int i
设置为static
那么答案将是0000
。为什么这个程序成功编译但运行失败?
变量i
具有输入功能main()
价值每一次(每次调用main()
拥有该变量的堆栈上自己的副本)。没有递归终止,因为递归终止的条件从未满足(即:--i
从不计算为零)。 因此,递归调用main()
,直到堆栈中没有更多位置。
但是,如果您将i
声明为static
,则所有对main()
的调用都有一个共享副本变量i
。当--i
评估为零时满足递归终止条件。
它运行的空间(堆栈),因为它正在为main()的indefinetely
代码本身是正确的,该程序将编译没有任何问题的呼叫。问题是条件if (--i)
将始终评估为真,因为每次递归调用main
时,会创建一个新的本地i
变量,并且总是值得5
。随着堆叠越来越多的调用,当堆栈无法再增长时,程序将由SIGSEGV终止。为什么程序输出0000
在声明i
为static
变量是因为i
不是在每一个main
呼叫重新声明
==10972== Memcheck, a memory error detector
==10972== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==10972== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==10972== Command: ./a.out
==10972==
==10972== Stack overflow in thread #1: can't grow stack to 0xffe801000
==10972==
==10972== Process terminating with default action of signal 11 (SIGSEGV)
理由是:你可以用Valgrind的观察此。所以基本main
递归调用,直到i
值得0
。然后,所有堆叠的printf
被执行,但是在这些堆栈调用中,每个堆栈调用中i
的值为0
,您将看到0000
。 static
关键字使所有main
调用实际上引用相同的i
变量而不是副本。
什么是你不明白?递归或静态变量? –
通过添加静态我得到0000,这是可以理解的,但问题是在循环中,终止条件不存在,现在我明白了。 – user8332164
您可以在这里查看我的答案,以了解当我们进行无限递归调用时会发生什么情况:https://stackoverflow.com/questions/45427160/why-am-i-getting-segmentation-fault-in-this/45429726#45429726 – babon