2012-01-05 18 views
2

私はCのprogaming faqの本を読んでいます。 はここ非静的変数の初期化

自動変数は、関数内で定義された変数であるか、静的なキーワードを使用せずにコードの をブロックする本の通路です。これらの変数は、明示的に初期化しないと、 の値が未定義です。 自動変数を初期化しない場合は、値を使用する前に に割り当てておく必要があります。ここで

私のコードです:変数が初期化されるのはなぜ

#include <stdio.h> 
int main (int argc, const char * argv[]) 
{  
    { 
     int x; 
     printf("%d", x); 
    } 
} 

printfの結果は0ですか?

+0

どの環境(OS、コンパイラなど)ですか? – fge

+0

誰が初期化されていますか?メモリ内のデータが実際にゼロであるのは単なる幸運かもしれません。 私はデバッグモードが自動的にロット変数をゼロに初期化すると思います。リリースでビルドして実行しようとしましたか? – Max

+2

出力が「初期化されていません」と思いますか? :) – pmg

答えて

4

静的変数と大域変数の場合は0です。自動変数はデフォルトでは初期化されません。

C言語では、非静的ローカル変数のデフォルト値はありません。変数は変数になる前にメモリ内にあったものを保持します。静的でないローカル変数をC言語で使用する前に(または少なくともそれを他のものと比較する前に)、常に初期化することが最善です。また、デフォルト値がないと仮定するのが最善です。これは、言語や言語、ハードウェアによって異なるためです。

続きを読む:http://wiki.answers.com/Q/What_is_the_default_value_of_integer_in_c#ixzz1iaij7hRK

3

初期化されていません。あなたのxが占めるメモリセルは、以前の使用からの値を持っています。ただし、xの値は何でもかまいません。したがって、それに頼ることはできません。

1

未定義は、何でもかまいません(0の場合もあります)。別の実装では、値が異なります。知る方法はありませんし、毎回同じことが同じであると信じることはできません。

0

一部のコンパイラはデフォルトの初期化を行いますが、一部のコンパイラでは初期化を行いません。あなたはそれらに数えてはいけません。それはあなたが望むかどう

int x; 

を言っラインは

int x = 0; 

を言う必要があります。いくつかのCコンパイラでは、printfが呼び出された時点でxが-23157263である可能性があります。

0

xが配置されているメモリ空間にはすでに0がありますが、これはちょうど "運がいい"ため、その場所に数字や記号がある可能性があります。 常に同じ結果を得るためには、常に変数を初期化する必要があります。

1

明示的に初期化されていない場合automatic変数の初期値は不定です。

未定義とは、指定されていない(0または42)、またはトラップ表現のいずれかを意味します。トラップとは、初期化されていない変数未定義ビヘイビアー(たとえば、プログラムをクラッシュさせる)を読み取ることを意味します。

0

コードがデバッグフラグでコンパイルされたときに、Visual Studioが自動変数を0またはnullに設定することがあることを思い出しました。他の人が言ったように、あなたは確かに任意のデフォルト値を数えるべきではありません。

関連する問題