Namespaces
Variants

Initialization

From cppreference.net

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

宣言子 について、初期化子(省略されない場合)は以下のいずれかになります:

= (1)
= { 初期化子リスト } (2)
= { } (3) (C23以降)

where initializer-list is a non-empty comma-separated list of initializer s (with an optional trailing comma), where each initializer has one of three possible forms:

(1)
{ 初期化子リスト } (2)
{ } (3) (C23以降)
指示子リスト = 初期化子 (4) (C99以降)

designator-list は、以下の形式の配列指定子または構造体/共用体メンバ指定子のリストである: [ constant-expression ] の形式の配列指定子、または . identifier の形式の構造体/共用体メンバ指定子;詳細は 配列初期化 および 構造体初期化 を参照。

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

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

目次

説明

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

明示的な初期化

初期化子が提供されている場合、以下を参照してください。

暗黙の初期化

初期化子が提供されていない場合:

空初期化

オブジェクトが明示的に初期化子 = { } から初期化される場合、そのオブジェクトは空初期化されます。

(C23以降)

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

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

注記

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

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

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

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

C言語にはC++の value initialization に対応する特別な構文は存在しない。ただし、 = { 0 } (または複合リテラル内での ( T ) { 0 } (C99以降) を代わりに使用できる。これはC標準が空の構造体、空の共用体、または長さ0の配列を許可していないためである。

(C23以前)

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

(C23以降)

#include <stdlib.h>
int a[2]; // aを{0, 0}に初期化
int main(void)
{
    int i;          // iを不定値に初期化
    static int j;   // jを0に初期化
    int k = 1;      // kを1に初期化
    // int x[3]を1,3,5に初期化
    // int* pを&x[0]に初期化
    int x[] = { 1, 3, 5 }, *p = x;
    // w(2つの構造体の配列)を以下に初期化
    // { { {1,0,0}, 0}, { {2,0,0}, 0} }
    struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2};
    // 関数呼び出し式はローカル変数に使用可能
    char* ptr = malloc(10);
    free(ptr);
// エラー: 静的ストレージ期間を持つオブジェクトは定数初期化子を必要とする
//  static char* ptr = malloc(10);
// エラー: VLAは初期化できない
//  int vla[n] = {0};
}

参考文献

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

関連項目

C++ documentation for Initialization
上記のHTMLを日本語に翻訳します:
C++ documentation for Initialization
翻訳結果: - "C++ documentation" はC++専門用語のため翻訳せず - "for" は「~のための」と翻訳 - "Initialization" はC++専門用語のため翻訳せず HTMLタグ、属性、およびC++専門用語はすべて原文のまま保持されています。