2016-03-26 15 views
-2

私はC言語を使い慣れていないので、このクエリが基本的であれば私を許してください。別の関数からmainを呼び出す

別の関数からmain()を呼び出し、プログラムを無限に実行したいと考えています。コードはここにあります:

#include <stdio.h> 

void message(); 

int main() 
{ 
    message(); 

    return 0; 
} 

void message() 
{ 
    printf("This is a test message. \n"); 

    main(); 
} 

私はこのプログラムが無限に動作することを期待しています。しかし、それはしばらくの間実行され、突然停止します。テストメッセージの横に印刷されたカウンタ変数を使用して、「これはテストメッセージです」というステートメントが見つかりました。 Iを取得その後174608回エラーメッセージ

セグメンテーション障害(コアダンプ)

を印刷し、プログラムを終了します。このエラーは何を意味しますか?なぜプログラムは174608回しか実行されないのですか(無限ではありません)

+4

は、あなたのマシンは、無限のRAMを持っていますか? –

+2

メソッドが呼び出されると、戻りアドレスがスタックに格納されます。メソッドが返ってくると、アドレスは再びスタックから取り出されます。しかし、あなたの方法は決して戻らず、お互いを交互に呼びます。だから、174608の呼び出しの後、あなたのスタックは単に完全です。そして、このスタックがオーバーフローすると、セグメンテーションフォールトが発生します。スタックオーバーフローはプロセス全体を破壊し、エラー処理を非常に困難にするため、明確なエラーメッセージはありません。 –

+0

回答提供されたRenéが正解であり、コメントではなく回答になるはずです。私はあなたのプログラムでmain関数を呼び出すべきではないということを追加したいだけです。決して。 (1)またはfor(;;)の間に無限ループを使用したい場合。 – lsrom

答えて

2

無限再帰からのスタックオーバーフローがあります。無限ループを作るmain

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

ねえ、それはサイトの名前です! – Kupiakos

+0

@Kupiakosそれはそれです:) – i486

0

相互再帰コストスタックスペース。再帰をmain()に置くと、末尾再帰を認識し、それを反復で置き換えることがあります。 [...楽しさと教育のために、は自宅でこれをしようとしていない、子供]:

#include <stdio.h>  

void message(); 

int main() 
{ 
    message(); 

    return main(); 
}  

void message() 
{  
    printf("This is a test message. \n"); 
} 

GCCは、最適化レベル= 2以上に末尾再帰を認識しています。 gccのための main.s出力-O2 -Sのmain.c:

 .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 
1

これはあなたに無限ループを与えるwhile(1) {...}for(;;) {...}、と等価ではありません。

関数(たとえば、main()またはmessage())が呼び出されるたびに、一部の値がスタックにプッシュされます。関数が何度も呼び出されると、スタックがいっぱいになり、最後にオーバーフローし、 "スタックオーバーフロー"エラーが発生します。彼らは同じ名前を持って起こるが、このエラーは、このサイトとは何の関係もないことを

注:)

関連する問題