2011-11-09 2 views
1
int fun() 
{ 
printf("\ncrap"); 
} 


void main() 
{ 
    printf("\n return value of fun %d", fun()); 
} 

の出力を返してください。戻り値のためにスタックがどのようにメモリを割り当て、どのようにスタックが動作するかについて説明してください。intを返しますが、明示的に何も返さない関数の戻り値は何ですか?たとえば、

+0

アーキテクチャに依存していることは知っていますが、一般的なことを求めています。 – Invictus

答えて

3

funトリガー未定義の動作

は常にすべてのコンパイラの警告を有効にしてコンパイルしてください。それは、あなたがそれを間違えているという警告を与えるはずです。

mainは、mainという単一の関数しか存在しないことをC++標準が要求し、intを返すため、未定義の動作を引き起こします。ただし、特殊なケースとして、(訂正された)main機能でreturn文を省略することはできます。

"スタック"は、あなたが推測するように、C++言語の一部ではありません。しかしそれは無関係です。標準では、返されたオブジェクトが呼び出し元のスコープ内に構築されていることを示しています。

(実際には、単に読み取りアクセスを後に、いない未返還intは、おそらくタイプintの初期化されていない変数のように終わるために起こっているが、標準関数呼び出しが既に未定義の動作をトリガーすることを言います。)

+1

Nah、常に*いくつかの*コンパイラ警告が有効になってコンパイルしてください。これを含む;-)(+1、しかし) –

+0

それで、あなたは何かが印刷されることを意味するのですか?... ...それは警告を出します...しかし、私はスタックについて知りたいのですが...私は何がスタックに格納されていることを意味しますか? – Invictus

+1

@Invictus:「%d」は「型int」を意味するので、すべての整数値*が出力される可能性があります。 「未定義の動作」とは、実際にプログラムが何らかの形で動作する可能性があることを意味します(クラッシュ、ハードディスクのフォーマット、ピザの注文)。実のところ、あなたはいつも 'printf'行にそれを作ってくれると思います。マイケル:私は 'ウォール'のようなものを意味した。必ずしも "すべてのあいまいで疑わしい警告"であるとは限りません。簡潔さはニットの魂、え? –

2

これは未定義の動作です。なんでも起こる可能性がある。

2

アーキテクチャに依存するので、一般的なことはありません。

ただし、最後に計算された値、または最後に呼び出された関数の戻り値はになることが認められます。しかし最終的には未定義の振舞いです。あなたがそれに頼りたいのであれば...

int main()の特別なケースがあります。 (Btw:void main()は標準ではありません)return文がない場合は、0を返します。

関連する問題