2016-11-28 9 views
2

コードに振る舞う:初期化されていない_Bool変数または構造体のフィールドは以下の妙

_Bool field0; 
char field1; 

printf("fieldX:    [%d]\t[%d]\n", field0,   field1); 
printf("fieldX ? 1 : 0:  [%d]\t[%d]\n", field0 ? 1 : 0, field1 ? 1 : 0); 
printf("!fieldX:    [%d]\t[%d]\n", !field0,  !field1); 
printf("!!fieldX:    [%d]\t[%d]\n", !!field0,  !!field1); 

を次のような出力が得られます。

fieldX:    [165] [165] 
fieldX ? 1 : 0:  [165] [1] 
!fieldX:    [164] [0] 
!!fieldX:    [165] [1] 

は非常に驚くべき、特に三項演算結果を検索します。

gcc 4.9.3および4.8.3、-O0、no -fltoでチェック。

備考:スタックは0xa5パターン(埋め込みC環境)で事前に初期化されています。

+2

自動ストレージを持つオブジェクトへのアクセス未定義の動作を呼び出します。ここには奇妙なことはありません。 – ouah

+3

@ouah - あなたはそのコメントで 'uninitialized'を見逃しますか? – 4386427

+0

["未定義の振る舞い"は実際に\ *何でも\ *を起こすことができますか?](http://stackoverflow.com/questions/32132574/does-undefined-behavior-really-permit-anything-to-happen) – kaylum

答えて

1

自動ストレージで初期化されていないオブジェクトにアクセスすると、未定義の動作が発生します。だからこそ何も変わっていない。

さらに、_Boolオブジェクトは、0または1の2つの値しか保持できません。実装では!!boolean_objectまたはboolean_object ? 1 : 0boolean_objectに置き換えることができます。

は(さえも-O0と、gccはまだいくつかの最適化を行っていることに注意してください。例えば、一度呼ばれる静的関数をインライン化)

1

初期化されていない自動変数にアクセスすると、ほとんどの場合undefined behaviourになります。

詳細については、this threadを参照してください。

関連する問題