gpt4 book ai didi

c - 为什么 int main() { return main();导致堆栈溢出而不是尾递归?

转载 作者:行者123 更新时间:2023-11-30 21:42:36 25 4
gpt4 key购买 nike

使用 GCC 在 Windows 上编译此文件。它立即崩溃,并显示异常代码:c00000fd

编辑:尝试编译以下代码(用于可见输出),它会导致堆栈溢出。

#include<stdio.h>
int main(void)
{
printf("Hello World\n");
return main();
}

输出 -

>gcc trailORoverflow.c -o trailORoverflow.exe

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World

它会持续打印 Hello World 一段时间并崩溃。

编辑:O2O3-O1 -foptimize-sibling-calls 优化不会崩溃。

最佳答案

您显示的代码将无限调用main,因此将导致堆栈溢出。这对于任何函数都是如此,而不是特定于 main。每个函数调用都会在内存中创建一个堆栈帧,并且随着递归的深入,会创建无限的此类帧,因此会出现堆栈溢出。

但是,如果您像下面的示例那样进行适当的基终止,对于 main 中的递归调用,那么就会出现有趣的事情。

int main (void)
{
static int x = 100;

if (x == 0)
{
return 0;
}
x--;
printf ("%d\n", x);
main ();
return 0;
}

在 C 和 C++ 语言中递归调用 main 是有区别的,我认为指出这一点很有趣。这是post我写了,我正在对此做出一些解释。

C++ 标准讨论了这些内容

第 3.6.1 节第 3 段

Recursive calls are permitted, except to the function named main. 

和第 5.2.2 节第 9 段

The function main shall not be used within the program. … … … 

我在C标准中没有发现任何这样的限制。我在C99标准第6.5.2.2节第11段中发现的关于递归调用的内容如下

Recursive function calls shall be permitted, both directly and indirectly through any chain of other functions. 

因此C语言中递归调用main是确定性的。但根据 C++ 标准,不允许从任何函数或递归调用 main。

关于c - 为什么 int main() { return main();导致堆栈溢出而不是尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37307624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com