名前空間
変種
操作

初期化

From cppreference.com
< c‎ | language

オブジェクトの宣言では、初期化として知られるプロセスを通じてその初期値を与えることができます。

宣言子に対して、初期化子が省略されない場合、以下のいずれかになります。

= expression (1)
= { initializer-list } (2)
= { } (3) (C23以降)

ここで initializer-list は、空ではないカンマ区切りの initializer のリストです(末尾にカンマがあってもよい)。各 initializer は以下の3つの形式のいずれかを取ります。

(1)
{ initializer-list } (2)
{ } (3) (C23以降)
designator-list = initializer (4) (C99以降)

ここで designator-list は、[ constant-expression ] という形式の配列指示子か、. identifier という形式の構造体/共用体メンバ指示子のリストです。詳細は配列の初期化および構造体の初期化を参照してください。

注意:初期化子に加えて、波括弧で囲まれた initializer-list複合リテラルに現れることがあります。これは以下の形式の式です。

( type ) { initializer-list }
( type ) { } (C23以降)
(C99以降)

目次

[編集] 解説

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

[編集] 明示的な初期化

初期化子が指定された場合、以下を参照してください。

[編集] 暗黙的な初期化

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

  • 自動記憶域期間を持つオブジェクトは、不定な値(トラップ表現である可能性があります)に初期化されます。
  • 静的およびスレッドローカル記憶域期間を持つオブジェクトは、空の初期化が行われます。

[編集] 空の初期化

オブジェクトは、初期化子 = {} を用いて明示的に初期化される場合、空の初期化が行われます。

(C23以降)

場合によっては、オブジェクトが明示的に初期化されない場合にも空の初期化が行われます。すなわち、

  • ポインタは、その型のヌルポインタ値に初期化されます。
  • 整数型のオブジェクトは、符号なしのゼロに初期化されます。
  • 浮動小数点型のオブジェクトは、正のゼロに初期化されます。
  • 配列のすべての要素、構造体のすべてのメンバ、共用体の最初のメンバは再帰的に空の初期化が行われ、さらにすべてのパディングビットはゼロに初期化されます。
(ヌルポインタ値と浮動小数点ゼロが全ビットゼロの表現を持つプラットフォームでは、静的オブジェクトに対するこの形式の初期化は、通常、プログラムイメージの.bssセクションに割り当てることで実装されます)

[編集] ノート

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

初期化子は、不完全な型のオブジェクト、VLA(可変長配列)、およびリンケージを持つブロックスコープのオブジェクトの宣言では使用できません。

関数パラメータの初期値は、初期化によってではなく、関数呼び出しの引数からの代入によって設定されるかのように確立されます。

不定な値が標準ライブラリ呼び出しの引数として使用された場合、その振る舞いは未定義です。それ以外の場合、不定な値を含む式の評価結果は不定な値となります(例:int n; において、n が自身と等しいと比較できない可能性や、後続の読み取りで値が変化するように見える可能性があります)。

C++の値初期化に対応する特別な構文はCにはありません。しかし、C標準では空の構造体、空の共用体、または長さゼロの配列が許可されていないため、代わりに = {0}(または複合リテラルでは (T){0}(C99以降) を使用できます。

(C23まで)

空の初期化子 = {}(または複合リテラルでは (T){})は、C++の値初期化と同じセマンティクスを実現するために使用できます。

(C23以降)

[編集]

#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};
}

[編集] 参照

  • C17標準 (ISO/IEC 9899:2018)
  • 6.7.9 Initialization (p: 100-105)
  • C11標準 (ISO/IEC 9899:2011)
  • 6.7.9 Initialization (p: 139-144)
  • C99標準 (ISO/IEC 9899:1999)
  • 6.7.8 Initialization (p: 125-130)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 6.5.7 Initialization

[編集] 関連項目

C++ドキュメント初期化
English 日本語 中文(简体) 中文(繁體)