C 从另一个函数调用main
我是C语言的新手,如果这个问题是基本的,请原谅我 我想从另一个函数调用main(),使程序无限运行。代码如下:C 从另一个函数调用main,c,function,main,C,Function,Main,我是C语言的新手,如果这个问题是基本的,请原谅我 我想从另一个函数调用main(),使程序无限运行。代码如下: #include <stdio.h> void message(); int main() { message(); return 0; } void message() { printf("This is a test message. \n"); main(); } #包括 无效消息(); int main() { 消息();
#include <stdio.h>
void message();
int main()
{
message();
return 0;
}
void message()
{
printf("This is a test message. \n");
main();
}
#包括
无效消息();
int main()
{
消息();
返回0;
}
无效消息()
{
printf(“这是一条测试消息。\n”);
main();
}
我希望看到这个程序无限期地运行。然而,它运行了一段时间,然后突然停止。我在测试消息旁边打印了一个计数器变量,我发现语句“thisatestmessage.”打印了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");
}
这并不等同于(;){…}(1){…}或(;;){…}的
while,后者提供无限循环
每次调用函数(例如,main()
或message()
)时,都会将一些值推入堆栈。当函数被调用太多次时,堆栈将被填满,最后溢出,从而出现“堆栈溢出”错误
请注意,此错误与此站点无关,尽管它们恰好具有相同的名称:)您的计算机是否具有无限内存?调用方法时,返回地址将放在堆栈上。当方法返回时,地址将再次从堆栈中获取。但是您的方法永远不会返回,它们会轮流调用。因此,在174608次调用之后,堆栈已满。这个堆栈过长会导致您收到的分段错误。没有更清晰的错误消息,因为堆栈溢出会破坏整个过程,使错误处理变得非常困难。René提供的答案是正确的,应该是答案,而不仅仅是注释。我只想补充一点,您永远不应该在程序中调用main函数。从未。如果您想要无限循环,请使用while(1)或for(;;)。@jamesbond。你们真的知道谁调用你们程序的Main()函数吗?你真的为无限循环运行而尝试了这段代码吗?@RenéVogt感谢你给出了这个漂亮的答案。我现在完全明白了。我不知道这个概念。我会永远记住的。嘿,那是网站的名字@库皮亚科斯就是这样:)
.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