- ベストアンサー
printf("%d",func())はなぜ実行できないのか?
main(){ int i; i = func(); printf("%d",i); } int func(){ return 1; } はちゃんと1が表示されるのになぜ、 main(){ printf("%d",func()); } int func(){ return 1; } は1が表示されず変な値になってしまうんでしょうか? funcのアドレスが表示されているんでしょうか? よろしくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
使っているコンパイラですが、VC++でしょうか? -85は16進でいうところのABです。(←恐らくこれはコンパイラがデバッグ用に埋め込んだ数値だと思います。リリースコンパイルでは落ちるか不定だと思います。) main関数とfunc関数ですが別ソース、或いは別プロジェクトではないですか? 関数を呼ぶ場合、stdcallとcdeclというものがありますが、これが一致しないとスタックが壊れます。 もしVC++であれば試しに以下のコードでうまく動かないか試してください。 int _cdecl func(); int main() { printf("%d\n",func()); return 0; } int _cdecl func() { return 1; }
その他の回答 (5)
- echoes_x86
- ベストアンサー率65% (21/32)
>原因をつきとめていただけました。 …私のアドバイス,ご理解いただけたのでしょうか? 原因など始めからはっきりしています. 質問者様がプロトタイプ宣言をつけてないからです. 「何故動かないのか」とのことですが,「動くことを期待する方がおかしい」のです. 上のコードが偶々動いたからと行ってそれを一般化するのはやめましょう. C++ としてコンパイルするなら必ずプロタイプ宣言をつけねばなりません. また,Cでコンパイルするのでも括弧が空だと弊害があります. http://wisdom.sakura.ne.jp/programming/c/c27.html などが参考になるでしょう. 呼び出し規約の既定値は __cdecl ですから, こちらの問題ではないでしょう. http://msdn.microsoft.com/ja-jp/library/46t77ak2%28VS.80%29.aspx …内容を吟味せずに機械的に「お礼」を言うのはよした方が良いですよ. 「原因をつきとめて」下さったなら,sha-girl 様に良回答をつけて閉じてしまえば良いでしょうに.
補足
回答ありとうございます。 言い忘れたのですがプロトタイプ宣言はしても 不具合は解消されません。
- sha-girl
- ベストアンサー率52% (430/816)
>cdeclとstdcallとはなんでしょうか? 「_cdecl」はコンパイラに関数を呼ぶ手順/呼ばれる手順を指示しています。(アセンブラレベルの話です) 「cdecl stdcall」で検索すれば沢山ヒットします。
- echoes_x86
- ベストアンサー率65% (21/32)
おはようございます. 回答としては C++ としてコンパイルされているから,となります. Visual Studio 2005 Express Edition で空のプロジェクトを作り, 上記のコードだけを含めてビルドしました. 結果,C++ ではコンパイルすらできませんでしたが, 「プロジェクトのプロパティ」→「構成プロパティ」→「C/C++」→「詳細」 と進み,「コンパイル言語の選択」の値を「C コードとしてコンパイル」としたところ,(危険なレベルの)警告はでましたが, 実行ファイルが生成され,所望の「1」の出力を得ました. 原因としては C と C++ では関数宣言の処理が違うためと考えられます. C は暗黙の宣言を int としますが,C++ はそうでなかったはずです. この辺りの違いが関数の引数と戻り値の処理を混乱させた結果,変なことになっているのでは? 書き方で結果が異なるのは下手をするとスタックの破壊をしていることすら考えられます. C++ を使うのであれば,この種の警告は無視せずに,必ずプロトタイプ宣言を行うべきでしょう. #include <stdio.h> int func(void); //引数なしだから念のために void と書いておく int main(void){ printf("%d",func()); } int func(void){ return 1; }
補足
ありがとうございます。 No.4の回答者様が原因をつきとめていただけました。
- asuncion
- ベストアンサー率33% (2127/6290)
>1が表示されず変な値になってしまうんでしょうか? その、変な値というのを教えていただかないと、 そちらで起きている現象を正確に把握できません。
補足
-85…と言ったすごい数字が出てきてしまうんです。 回答ありがとうございます。
- notnot
- ベストアンサー率47% (4900/10361)
関数の型の宣言をしていないので、警告メッセージは出ますが、今のCだと、1 と表示されるはずです。お書きの6行以外に何か書いてませんか?あるいは特殊なコンパイラでしょうか?
補足
コンパイラはビジュアルスタディオ2005です。
補足
回答ありがとうございます。 コンパイラはVC++です。 回答者様の言うとおり、メイン関数とfunk関数は別のCファイルでプロジェクトは同じプロジェクトです。 cdeclとstdcallとはなんでしょうか?