在c中的main()中调用main() < >在C?< /p> < p>是的,C允许你调用main函数(C++) < p>是的,我们可以在main()函数中调用main()。

在c中的main()中调用main() < >在C?< /p> < p>是的,C允许你调用main函数(C++) < p>是的,我们可以在main()函数中调用main()。,c,C,函数本身调用函数的过程称为递归 可以在main()函数中调用main(),但是应该有一个条件,该条件不调用main()函数来终止程序 否则,程序将永远不会返回并无限运行。确实允许从自身调用main(),甚至可以使用用于任何其他递归代码的相同方法避免堆栈溢出,终止条件如下: #include <stdio.h> int main (int argc, char *argv[]) { printf ("Running main with argc = %d, last

函数本身调用函数的过程称为递归

可以在main()函数中调用main(),但是应该有一个条件,该条件不调用main()函数来终止程序


否则,程序将永远不会返回并无限运行。

确实允许从自身调用
main()
,甚至可以使用用于任何其他递归代码的相同方法避免堆栈溢出,终止条件如下:

#include <stdio.h>
int main (int argc, char *argv[]) {
    printf ("Running main with argc = %d, last = '%s'\n",
        argc, argv[argc-1]);
    if (argc > 1)
        return main(argc - 1, argv);
    return 0;
}
然而,由于这只是轶事证据,我们应该转向标准。ISO C11第4节合规性规定:

1/在本国际标准中,“应”应解释为对实施或计划的要求;相反,“不得”应解释为禁止

2/如果违反了出现在约束或运行时约束之外的“应”或“不应”要求,则行为未定义。未定义的行为在本国际标准中以“未定义的行为”或省略任何明确的行为定义来表示。这三者在重点上没有区别;它们都描述了“未定义的行为”

3/在所有其他方面均正确、在正确数据上运行、包含未指定行为的程序应为正确程序,并按照5.1.2.3执行

现在,由于标准中没有明确禁止
main()
调用自身,因此上面的第3条是控制方面

进一步的支持可以在两个地方看到(我的粗体),第一个是在
5.1.2.2.3节程序终止中:

1/如果
main
函数的返回类型与
int
兼容,则从initial调用返回
main
函数相当于调用
exit
函数,将
main
函数返回的值作为其参数

然后在第7.21.3节文件中:

5/随后可通过相同或另一程序执行重新打开文件,并回收或修改其内容(如果可以在开始时重新定位)。如果
main
函数返回其原始调用方,或者如果调用了
exit
函数,则在程序终止之前关闭所有打开的文件(因此刷新所有输出流)

这两个子部分都支持在初始/原始调用的基础上可能还有其他调用
main()

可以。

简单程序:

int main()
{
    printf("Anything");
    main();
    return 0;
}
说明:

int main()
{
    printf("Anything");
    main();
    return 0;
}
调用堆栈
函数堆栈
用于几个相关目的,但拥有调用堆栈的主要原因是跟踪每个活动子例程在完成执行时应返回控制的点

调用堆栈上使用太多内存时,会发生
堆栈溢出


这里反复调用函数
main()
,其返回地址存储在堆栈中。堆栈内存已满后。它显示
堆栈溢出错误

您尝试过吗?它起作用了吗?没有任何东西阻止您在其上下文中调用函数。这叫做递归。@Donnie仅仅因为某些东西在测试示例中似乎有效并不意味着它总是有效的,或者是正确的。“试试看它是否有效”在C中经常是危险的@nos:我仍然希望作者至少在提问之前先尝试一下,并分享他/她的经验。我不喜欢人们把它当作一个交互式的谷歌界面。这是一个合法的问题,例如C++标准特别禁止它,而“尝试看看它是否有效”的方法很可能显示“它工作”如果这个问题是关于C++的,但它是不正确的。为什么不能用C++调用它?@ THEFMeMe:最简单的全局构造函数(没有OS和底层C运行时条目代码的特殊支持)是C++编译器在代码的开始时生成函数调用的。每次递归调用
main
时都要重建全局对象,这是一件相当糟糕的事情…:-)@不,你能指出在任何C标准中专门处理递归的地方吗?如果它是专门处理的,我想你应该改为链接。当堆栈空间用完时,它会导致堆栈溢出。除非编译器进行尾部调用优化,但无论如何,你不能依赖它,所以要避免无休止的递归。