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() { 消息();

我是C语言的新手,如果这个问题是基本的,请原谅我

我想从另一个函数调用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