名前空間
変種
操作

初期化

提供: cppreference.com
< c‎ | language

オブジェクトの宣言初期化と呼ばれる処理を通して初期値を提供することができます。

それぞれの宣言子に対して、以下のいずれかの初期化子を使用できます(省略しない場合)。

= expression (1)
= { initializer-list } (2)

initializer-list は空でないコンマ区切りの initializer の式であり (最後にもコンマを付けても構いません)、それぞれの初期化子は以下のいずれかの形式を取ります。

expression (1)
{ initializer-list } (2)
designator-list = initializer (3)

designator-list[ constant-expression ] 形式の配列指定子または . identifier 形式の構造体/共用体メンバ指定子です。 配列の初期化および構造体の初期化を参照してください。

目次

[編集] 説明

初期化はオブジェクトに格納される初期値を指定します。

[編集] 明示的な初期化

初期化子が指定されている場合、

[編集] 暗黙の初期化

初期化子が指定されていない場合、

  • 自動記憶域期間のオブジェクトは不定の値に初期化されます (トラップ表現の可能性もあります)
  • 静的またはスレッドローカル記憶域期間のオブジェクトは以下のように初期化されます
  • ポインタはその型のNULLポインタに初期化されます
  • 整数型のオブジェクトは符号なしのゼロに初期化されます
  • 浮動小数点型のオブジェクトは正のゼロに初期化されます
  • 配列、構造体、共用体のメンバは再帰的に上記のように初期化され、パディングビットはすべてゼロに初期化されます
(NULLポインタおよび浮動小数点のゼロがオールゼロのビット表現を持つプラットフォームでは、静的オブジェクトに対するこの形式の初期化は通常、プログラムイメージの .bss セクションに確保することで実装されます)

[編集] ノート

静的またはスレッドローカル記憶域期間のオブジェクトを初期化する場合、初期化子のすべての expression定数式または文字列リテラルでなければなりません。

初期化子は不完全型、VLAのオブジェクトや、リンケージを持つブロックスコープのオブジェクトの宣言では、使うことができません。

関数の仮引数の初期値は、初期化ではなく、関数呼び出しの実引数から代入されるかのように確立されます (ただし、C11 出版後の欠陥報告 DR 427 で初期化という用語の使い方が変更されました)。

標準ライブラリの呼び出しに対する引数として不定値を使用した場合、動作は未定義です。 そうでなければ、不定値を含む式の結果は不定値です (例えば、 int n; をそれ自身と比較して等しいかどうかはわかりませんし、読み取るたびに異なる値が得られる可能性もあります)。

[編集]

#include <stdlib.h>
int a[2]; // initializes a to {0, 0}
int main(void)
{
    int i;          // initializes i to an indeterminate value
    static int j;   // initializes j to 0
    int k = 1;      // initializes k to 1
 
    // initializes int x[3] to 1,3,5
    // initializes int* p to &x[0]
    int x[] = { 1, 3, 5 }, *p = x;
 
    // initializes w (an array of two structs) to
    // { { {1,0,0}, 0}, { {2,0,0}, 0} }
    struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2};
 
    // function call expression can be used for a local variable
    char* ptr = malloc(10);
    free(ptr);
 
//  Error: objects with static storage duration require constant initializers
//  static char* ptr = malloc(10);
 
//  Error: VLA cannot be initialized
//  int vla[n] = {0};
}


[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 6.7.9 Initialization (p: 139-144)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.7.8 Initialization (p: 125-130)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.5.7 Initialization

[編集] 関連項目

初期化C++リファレンス