繁体   English   中英

从另一个函数调用 main

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM