2016-10-18 7 views
2

これは私の最初の質問です。お会いできてうれしい! Linux上ですべては私が期待どおりに動作しながら、CWindows上のgccが変数に特定の値を割り当てるのはなぜですか?

gcc -o C:\test.exe test.c(gccのバージョン2015年6月27日)を使用してWindows上でコンパイル
#include <stdio.h> 

int main(){ 
int choice; 

printf("\nSize of 'choice' %d\n", sizeof(choice)); 
printf("Size of 'int' %d\n", sizeof(int)); 
printf("Value of 'choice %d\n", choice); 
return 0; 
} 

で書かれたこのコードは、これらの値

Size of 'choice' 4 
Size of 'int' 4 
Value of 'choice 2 

を返す理由を誰かが説明してもらえこれらの値を返す

Size of 'choice' 4 
Size of 'int' 4 
Value of 'choice 0 

私は何が欠けていますか?

ありがとうございます。

+1

未定義の動作に異なりますので、そのデフォルト値が定義されていない初期化されていないランダムな値が含まれ、それが何」です失われた –

+0

初期化されていない変数へのアクセスは未定義の動作です(何か起こります) –

+0

http://stackoverflow.com/documentation/c/364/undefined-behavior/1472/use-of-an-uninitialized-variable#t=20161018123252455759 – Abhineet

答えて

6

非初期化されたローカル非静的変数は、初期化されていないです。彼らは不確定の値を持ちます。初期化せずにこれらを使用すると、の定義されていない動作になります。

+1

はい*初期化されていない*未定義の*変数を持つことができますが、設定する前にそれらを読むと*未定義の動作になります* –

2

何が欠けていますか?

最初にchoiceを初期化しません。したがって、その動作は未定義です。どのコンパイラを使用しているかは関係ありません。印刷される値はメモリ位置のごみ値です。choiceです。

+0

*未定義の動作*の意味...未定義です。印刷物はなく、ちょうどクラッシュする可能性があります。 –

+0

この場合、クラッシュすることはできません。変数 'choice'は初期化されていませんが、既に定義されています。つまり、すでにメモリロケーションが適切に割り当てられています。 'printf'は単にそのメモリ位置に格納されているものを読み込みます。クラッシュする可能性のあるポインタや無効なメモリアクセスはありません。 – artm

+0

悲しいことに、標準を読んでいれば、その中にトラップ表現が存在する可能性があります。無効なビット設定は、その型の値の有効な表現ではありません。私は知っている、これは一般的ではありませんが、その可能性があるという事実は、未定義の動作につながります。 –

3

コードでは、初期値を指定せずに変数を定義したので、変数を自動的に何かに初期化するふりをすることはできません。

変数をゼロで初期化する場合は、=0で明示的に指定してください。

1

初期化せずに変数を使用しようとしました。だから、それができが

-1

が選択変数の値は、それが自動ストレージ・クラスであり、それは、異なるプラットフォーム

関連する問題