C言語関係掲示板

過去ログ

No726 関数から main に戻れない

[戻る] [ホームページ]
No.8908

抽象的
投稿者---れん(2003/08/12 13:59:56)


抽象的な質問ですみません、ソースが長すぎてそのまま書くわけにいかないので・・・

以下のような文を書きました。

main( )
{
・・・・・
input = kansu1(a);
printf(" test1");
・・・・・
}

int kansu1 ( int b )
{
・・・・・
flag = kansu2 ( i , j ); ←
printf(" flag = %d ", flag);
return (flag);
}

int kansu2(・・・・
・・・・・・

省略していますが関数や変数の宣言等には問題ありません。
実行したところ、flag = 1 が表示されましたので、
kansu2全文と、kansu1 のリターン文の前までは正しく動いているようです。
しかしtest1 が表示されず止まってしまうのです。
ちなみに,諒犬 flag = 1; に書き換えるとすべて正しく動きます。
こんなことってあるのでしょうか?

おわかりになられましたらご回答のほどお願い致します。



No.8909

Re:抽象的
投稿者---かずま(2003/08/12 14:17:13)



> kansu2全文と、kansu1 のリターン文の前までは正しく動いているようです。
> しかしtest1 が表示されず止まってしまうのです。
> ちなみに,諒犬 flag = 1; に書き換えるとすべて正しく動きます。
> こんなことってあるのでしょうか?

kansu1 から main に戻れないということは、スタック上に退避された
戻り番地が壊されているのでしょう。kansu2 を呼ばないと、戻れると
いうことは kansu2 の中で壊しているのでしょう。
例えば、次のプログラム。
#include <stdio.h>

int kansu1(int);
int kansu2(int, int);

int main(void)
{
    int input, a = 1;
    input = kansu1(a);
    printf(" test1");
    return 0;
}

int kansu1(int b)
{
    int flag, i = 3, j = 5;
    flag = kansu2(i , j);
    printf(" flag = %d ", flag);
    return (flag);
}

int kansu2(int i, int j)
{
    int a[3];
    for (i = 6; i < 100; i++) a[i] = i; /* スタックを破壊 */
    return 1;
}

処理系に依存します。

No.8937

Re:抽象的
投稿者---れん(2003/08/14 19:13:47)


まったくもってその通りでした。
kansu2 の中でスタックを破壊してしまっていました。
大変参考になりました。ありがとうございました。