C程序使用和不使用参数递归调用main()

时间:2017-06-08 07:57:29

标签: c recursion main

为什么它会给出分段错误的错误(核心转储)并且在第一种情况下没有输出?有人能用参数解释程序是如何主要递归的吗?

#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);
    }
}

6 个答案:

答案 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,作为输出。