#include <stdio.h>
main()
{
int i=5;
if(--i)
{
main();
printf("%d ",i);
}
请注意,如果我们将int i
设为static
,则答案为0000
。
答案 0 :(得分:3)
每次输入函数i
时,变量main()
的值为 5 (每次调用main()
都拥有自己的变量副本堆)。没有递归终止,因为永远不会满足递归终止的条件(即:--i
永远不会计算为零)。
因此,递归调用main()
,直到堆栈上没有其他位置。
如果您将i
声明为static
,则对i
的所有调用都有一个变量main()
的共享副本。当--i
求值为零时,满足递归终止条件。
答案 1 :(得分:0)
它耗尽空间(在堆栈上),因为它正在调用main()unfinetely
答案 2 :(得分:0)
代码本身是正确的,程序将编译没有任何问题。问题是条件if (--i)
将始终评估为true,因为每次递归调用main
时,都会创建一个新的本地i
变量并始终值5
。当您堆叠越来越多的调用时,当堆栈不再增长时,程序将由SIGSEGV终止。你可以用Valgrind来观察这个:
==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)
当您将0000
声明为i
变量时,该计划输出static
的原因是因为i
未在每次main
次调用时重新声明。所以基本上main
被递归调用,直到i
值0
。然后,执行所有堆叠的printf
,但在每个堆叠的调用中i
值0
,您将看到0000
。 static
关键字使所有main
次调用实际引用相同的i
变量,而非副本。