再帰関数のオーバーフロー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tieria

再帰関数のオーバーフロー

#1

投稿記事 by tieria » 16年前

初心者です

常駐型のプログラムを考えています

このコードは、無限ループになりますので万が一にでも実行されないよう
#の前に*をおいてます。実行しないでください(私は実行していません)

お尋ねしたかったのは、
aは解放されないため、いずれはオーバーフローとなることはわかりますが、
b,c,e,dはどうなのでしょうか?
comparefuncが終わった時点でreturnされているため、解放されると思っているのですが・・・

もし、解放されないとしたら、すべてグローバルにしても、
strcmpなどの標準関数の実装例での変数はローカルですから、いずれはオーバーフローしてしまうことになりますよね?つまり、グローバルにしても解決にはならず、いずれは か・な・ら・ず・起こってしまうのでしょうか?

愚問すいません よろしくお願いします
*#include <stdio.h>
#include <string.h>

int loopfunc(void);
int comparefunc(int b);

int main(void)
{
	loopfunc();
	return 0;
}
int loopfunc(void)
{
	int a = 0;
	a++;
	comparefunc(a);
	loopfunc();
	return 0;
}
int comparefunc(int b)
{
	char c[/url] = "abcdefg";
	char d[/url] = "abcdefgh";
	int  e;
	
	e = strcmp(c, d);
	printf("%d, %d\n", b, e);
	return 0;
}

御津凪

Re:再帰関数のオーバーフロー

#2

投稿記事 by 御津凪 » 16年前

これは再帰関数の無限ループによるスタックオーバーフローですね。

基本、関数を呼び出すだけでもスタックを使う(戻り先を保存するため)ので、
int func(){return func();}
でもスタックオーバーフローします。

だからローカル・グローバル関係なく再帰関数の無限ループなら必ずなります。

ねこ

Re:再帰関数のオーバーフロー

#3

投稿記事 by ねこ » 16年前

1回目と2回目のloopfunc関数で宣言される「a」はメモリ上別物です。

ねこ

Re:再帰関数のオーバーフロー

#4

投稿記事 by ねこ » 16年前

しまた、良く読んでなかった。
スタックオーバーフローの事でしたか。

御津凪のおっしゃる通り、無限ループしてるのでいずれクラッシュしますね。
変数云々でなく「無限ループ」で、です

tieria

Re:再帰関数のオーバーフロー

#5

投稿記事 by tieria » 16年前

ねこさん、ありがとうございました。

tieria

Re:再帰関数のオーバーフロー

#6

投稿記事 by tieria » 16年前

あ・・・投稿されてない・・・

御津凪さん、ねこさん、ありがとうございました

これで、おもいきってmallocに書き換える決心がつきました!

tieria

Re:

#7

投稿記事 by tieria » 16年前

いや・・・ちょっと待ってください

スタック・ヒープの問題ではなく、

御津凪さん曰く
int func(){return func();}
でもスタックオーバーフローします。
ってことは、無限ループ自体が問題なのですから、mallocにしても・・・

ちょっとよく考えます

box

Re:再帰関数のオーバーフロー

#8

投稿記事 by box » 16年前

> これで、おもいきってmallocに書き換える決心がつきました!

無限ループの話と、mallocにするかどうかという話とは、関係ないです。

tieria

Re:再帰関数のオーバーフロー

#9

投稿記事 by tieria » 16年前

>>Boxさん
 ご指摘のとおりです

たかぎ

Re:再帰関数のオーバーフロー

#10

投稿記事 by たかぎ » 16年前

loopfuncの返却値をなくすか、
int loopfunc(void)
{
	int a = 0;
	a++;
	comparefunc(a);
	return loopfunc();
}
のようにすれば、スタックオーバーフローを回避できる可能性があります。

tieria

Re:再帰関数のオーバーフロー

#11

投稿記事 by tieria » 16年前

>> たかぎ さん ありがとうございます

書きなおしていたのですが、
ソースコード上では、void loopfunc(void)として、変数もグローバルとしても(こうなると
関数が関数ではなく簡略記法のコードみたになってしまいますが・・・)
標準関数を使用すると、どうしてもスタックが発生してしまいます
なので・・・あきらめたくないのですが・・・あきらめま。

みなさん、ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る