2016-03-25 7 views
1

この短い例では、私が昨日持っていた試験からの質問:初期化されていない変数はメモリを占有していますか?

int main() { 
    short a; 
} 

ん「」は任意のメモリ空間を占有?私が作ったとき:

printf("%u %d\n",a, sizeof(a)); 

私が印刷されます「0 2」ので、私は「0」と思った何のメモリがまだ初期化されなかったが、私の先生は、はい、それはすでに2つのバイトを占めていると言う意味しました。

ありがとう、 Dani。

+0

'printf()'、変数は未使用であるため最適化されます。 –

+1

あなたの質問に初期化されていない変数が含まれています(タイトルのように初期化されていない変数があります) –

+0

あなたの質問には初期化されていない変数が含まれています。初期化されていない変数(実際には値にアクセスする)を表示すると、未定義の動作が発生します。 – Peter

答えて

2

初期化された変数はメモリを占有していますか?

はい。私は初期化されていないを使用することを意味すると推測しています。答えはまだはいです。

printfの呼び出しのように、初期化されていない変数の値を使用すると、プログラムは未定義の動作をします。

ただし、sizeof(a)はコンパイル時に計算されます。変数が初期化されているかどうかには依存しません。

3

正解は '多分'です。コンパイラは、メモリを占有しているという錯覚を与えなければなりません。

しかし、コンパイラは、その錯覚を維持する限り、自由に自由に行うことができます。 printfのない例では、変数aは決して使用されません。コンパイラは自由に最適化するので、メモリを使用しないことがあります。実際、gccの場合は-O3などの最適化フラグを有効にするとよく発生します。

1

short a;を宣言した場合、コンパイラはaのメモリを割り当てます。このメモリには不確定な値が含まれています。この場合は0かもしれませんが、それはあなたが得ているものですが、プログラムの動作は定義されておらず、何も言えません。

0

はい。宣言された変数はスペースを占有します。 sizeof演算子は短いデータ型のサイズを返します。

また、宣言した後に "a"を使用していない場合、たとえば、コードを初期化したりコード内の他の場所で使用したりすると、コンパイラが最適化する可能性があります。

+0

初期化されていても、その値が未使用の場合、変数とその初期化はコードから最適化されることに注意してください。 –

1

多くの要因によって異なります。

まず、オプティマイザは、その変数を完全に削除する(またはしない)ことがあります。 printfコール(UBで、他の人が注記したように)で実際に使用するのは、あなたのコード部分にはあまり意味がありません。

次に、「占有メモリ」とはどういう意味ですか?ここでは、おそらくコンパイラはスタック・メモリを使用します。これは、あとでプロセスのために予約する必要があります。そして、それがmain()の中になければ、そのメモリは関数の復帰時に解放されていました。それは実際には "実用的な"無駄ではありません。

私は '0' はメモリがまだ

ハズレを初期化しなかった意図と思いました。 「初期化済み」と言えば、「既知の値に初期化された」という意味です。一方、「初期化されていない」は「非ゼロ」を意味するのではなく、「いくらかのゴミ」/「わからない」/「私は気にしない」などです。

関連する問題