[英]Calling main from another function
我是 C 的新手,所以如果这个查询是基本的,请原谅我。
我想从另一个函数调用 main(),并使程序无限运行。 代码在这里:
#include <stdio.h>
void message();
int main()
{
message();
return 0;
}
void message()
{
printf("This is a test message. \n");
main();
}
我希望看到这个程序无限运行。 但是,它运行了一段时间,然后突然停止。 使用我在测试消息旁边打印的计数器变量,我发现语句“这是一条测试消息”。 打印 174608 次,之后我收到一条错误消息
分段错误(核心转储)
并且程序终止。 这个错误是什么意思? 为什么程序只运行了 174608 次(为什么不是无限次)?
你有无限递归的堆栈溢出。 在main
无限循环:
int main()
{
while (1)
{
//...
}
}
相互递归会消耗堆栈空间。 如果将递归放在main()
本身中,编译器可能会识别尾递归,并通过迭代替换它。 [为了好玩和教育,不要在家里尝试这个,孩子们......]:
#include <stdio.h>
void message();
int main()
{
message();
return main();
}
void message()
{
printf("This is a test message. \n");
}
GCC 识别优化级别=2 及以上的尾递归。 gcc -O2 -S main.c 的 main.s 输出:
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
.p2align 4,,7
.p2align 3
.L4:
call message
jmp .L4
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
.section .note.GNU-stack,"",@progbits
这不等同于while(1) {...}
或for(;;) {...}
,它们会给你无限循环。
每次调用函数(例如main()
或message()
)时,都会将一些值压入堆栈。 当函数被调用太多次时,你的堆栈被填满,最后溢出,给你一个“堆栈溢出”错误。
请注意,此错误与此站点无关,尽管它们碰巧具有相同的名称:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.