c-从另一个函数调用main



我是C的新手,所以如果这个查询是基本的,请原谅我。

我想从另一个函数调用main(),使程序无限运行。代码在这里:

#include <stdio.h>
void message();
int main()
{
    message();
    return 0;
}
void message()
{
    printf("This is a test message. n");
    main();
}

我希望看到这个程序无限运行。然而,它运行了一段时间,然后突然停止。使用我在测试消息旁边打印的计数器变量,我发现语句"This is a test message."被打印了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())时,都会将一些值推入堆栈。当函数被调用过多次时,堆栈会被填满,最后会溢出,从而导致"堆栈溢出"错误。

请注意,此错误与此站点无关,尽管它们恰好具有相同的名称:)

相关内容

  • 没有找到相关文章

最新更新