从另一个函数

时间:2016-03-26 12:40:48

标签: 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();
}

我希望看到这个程序无限运行。然而,它运行一段时间然后突然停止。使用我在测试消息旁边打印的计数器变量,我发现声明“这是测试消息”。打印174608次,之后收到错误消息

  

分段错误(核心转储)

并且程序终止。这个错误是什么意思?为什么程序只运行174608次(为什么不能无限制地运行)?

3 个答案:

答案 0 :(得分:1)

你有无限递归的堆栈溢出。在main中进行无限循环:

int main()
{
  while (1)
  {
    //...
  }
}

答案 1 :(得分:0)

相互递归会降低堆栈空间。如果您将递归放在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

答案 2 :(得分:0)

这不等同于while(1) {...}for(;;) {...},它们为您提供无限循环。

每次调用函数(例如,main()message())时,某些值都会被推入堆栈。当函数被调用太多次时,你的堆栈会被填满,最后溢出,给你一个堆栈溢出&#34;错误。

请注意,此错误与此网站无关,但它们碰巧具有相同的名称:)