C程序递归呼叫对Main()带有和没有参数



为什么它会出现分割故障的错误(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,是输出。

相关内容

  • 没有找到相关文章

最新更新