2017-08-02 153 views
0
#include <stdio.h> 
main() 
{ 
int i=5; 
    if(--i) 
    { 
     main(); 
     printf("%d ",i); 
    } 

请注意,如果我们将int i设置为static那么答案将是0000为什么这个程序成功编译但运行失败?

+3

什么是你不明白?递归或静态变量? –

+0

通过添加静态我得到0000,这是可以理解的,但问题是在循环中,终止条件不存在,现在我明白了。 – user8332164

+0

您可以在这里查看我的答案,以了解当我们进行无限递归调用时会发生什么情况:https://stackoverflow.com/questions/45427160/why-am-i-getting-segmentation-fault-in-this/45429726#45429726 – babon

回答

3

变量i具有输入功能main()价值每一次(每次调用main()拥有该变量的堆栈上自己的副本)。没有递归终止,因为递归终止的条件从未满足(即:--i从不计算为零)。 因此,递归调用main(),直到堆栈中没有更多位置。

但是,如果您将i声明为static,则所有对main()的调用都有一个共享副本变量i。当--i评估为零时满足递归终止条件。

+0

明白了,谢谢你的伙计 – user8332164

+1

@眠りネロク我会借此机会使用单词“**堆栈溢出**”... – Scheff

+0

@Scheff多么方便... –

0

它运行的空间(堆栈),因为它正在为main()的indefinetely

0

代码本身是正确的,该程序将编译没有任何问题的呼叫。问题是条件if (--i)将始终评估为真,因为每次递归调用main时,会创建一个新的本地i变量,并且总是值得5。随着堆叠越来越多的调用,当堆栈无法再增长时,程序将由SIGSEGV终止。为什么程序输出0000在声明istatic变量是因为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,您将看到0000static关键字使所有main调用实际上引用相同的i变量而不是副本。

相关问题