dポイントプレゼントキャンペーン実施中!

main(){
int i;
i = func();
printf("%d",i);
}

int func(){
return 1;
}

はちゃんと1が表示されるのになぜ、

main(){
printf("%d",func());
}

int func(){
return 1;
}

は1が表示されず変な値になってしまうんでしょうか?
funcのアドレスが表示されているんでしょうか?

よろしくお願い致します。

A 回答 (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;
}

この回答への補足

回答ありがとうございます。

コンパイラはVC++です。

回答者様の言うとおり、メイン関数とfunk関数は別のCファイルでプロジェクトは同じプロジェクトです。
cdeclとstdcallとはなんでしょうか?

補足日時:2010/02/14 16:33
    • good
    • 0

>原因をつきとめていただけました。


…私のアドバイス,ご理解いただけたのでしょうか?
原因など始めからはっきりしています.
質問者様がプロトタイプ宣言をつけてないからです.
「何故動かないのか」とのことですが,「動くことを期待する方がおかしい」のです.
上のコードが偶々動いたからと行ってそれを一般化するのはやめましょう.
C++ としてコンパイルするなら必ずプロタイプ宣言をつけねばなりません.

また,Cでコンパイルするのでも括弧が空だと弊害があります.
http://wisdom.sakura.ne.jp/programming/c/c27.html
などが参考になるでしょう.

呼び出し規約の既定値は __cdecl ですから,
こちらの問題ではないでしょう.
http://msdn.microsoft.com/ja-jp/library/46t77ak2 …

…内容を吟味せずに機械的に「お礼」を言うのはよした方が良いですよ.
「原因をつきとめて」下さったなら,sha-girl 様に良回答をつけて閉じてしまえば良いでしょうに.

この回答への補足

回答ありとうございます。

言い忘れたのですがプロトタイプ宣言はしても
不具合は解消されません。

補足日時:2010/02/21 17:15
    • good
    • 0

>cdeclとstdcallとはなんでしょうか?


「_cdecl」はコンパイラに関数を呼ぶ手順/呼ばれる手順を指示しています。(アセンブラレベルの話です)
「cdecl stdcall」で検索すれば沢山ヒットします。
    • good
    • 0

おはようございます.



回答としては 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の回答者様が原因をつきとめていただけました。

補足日時:2010/02/14 16:35
    • good
    • 0

>1が表示されず変な値になってしまうんでしょうか?



その、変な値というのを教えていただかないと、
そちらで起きている現象を正確に把握できません。

この回答への補足

-85…と言ったすごい数字が出てきてしまうんです。

回答ありがとうございます。

補足日時:2010/02/13 11:03
    • good
    • 0

関数の型の宣言をしていないので、警告メッセージは出ますが、今のCだと、1 と表示されるはずです。

お書きの6行以外に何か書いてませんか?あるいは特殊なコンパイラでしょうか?

この回答への補足

コンパイラはビジュアルスタディオ2005です。

補足日時:2010/02/13 11:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!