初期化とストレージ・クラス

このトピックには、以下の事項の説明が含まれています。

自動変数の初期化

auto 変数 (関数仮パラメーターを除く) は、初期化できます。 自動オブジェクトを明示的に初期化しない場合は、その値は確定できません。 初期値を提供する場合は、初期値を表す式を C の有効な式にすることが できます。オブジェクトの定義を含むプログラム・ブロックに入るたびに、 オブジェクトはその初期値にセットされます。

goto ステートメントを使用し、ブロックの中央にジャンプする場合は、 そのブロック内の自動変数は初期化されないことに留意してください。

静的変数の初期化

静的オブジェクトの初期化は、定数式、 または既に extern または static と宣言されているオブジェクトのアドレスに変換する式 (多くの場合、定数式によって変更されます) を使用して実行できます静的 (または外部) 変数を明示的に初期化しない場合、それがポインターでなけれ ば、その初期値は、該当する型の値ゼロになります。その変数がポインターの場合は、NULL に初期化されます。

ブロック内の static 変数は、プログラム実行の前に 1 回初期化されるだけですが、初期化指定子を持つ auto 変数は、それが存在するようになるたびに初期化されます。

外部変数の初期化

extern ストレージ・クラス指定子を持つオブジェクトは、で初期化できます。extern オブジェクトの初期化指定子は次のどちらかでなければなりませ ん。
  • 定義の一部として現れ、定数式によって初期値が記述されていなければならない。
  • 静的ストレージ期間を持つ、既に宣言済みのオブジェクトのアドレス に変換されなければならない。 このオブジェクトは、ポインター演算によって変更することができます。 (言い換えると、オブジェクトは、整数定数式の加算または減算によって変更することができます。)

extern 変数を明示的に初期化しない場合は、その初期値は、該当する型のゼロになります。 extern オブジェクトの初期化は、プログラムが実行を開始するときまでに完了しています。

レジスター変数の初期化

関数仮パラメーターを除く register オブジェクトを初期化できます。自動オブジェクトを初期化しない場合は、 その値は確定できません。初期値を提供する場合は、初期値を表す式を C の有効な式にすることが できます。オブジェクトの定義を含むプログラム・ブロックに入るたびに、 オブジェクトはその初期値にセットされます。