Initialization
オブジェクトの 宣言 は、 初期化 として知られるプロセスを通じてその初期値を提供することができます。
各 宣言子 について、初期化子(省略されない場合)は以下のいずれかになります:
=
式
|
(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
は、以下の形式の配列指定子または構造体/共用体メンバ指定子のリストである:
注記:初期化子に加えて、中括弧で囲まれた initializer-list は 複合リテラル 内に現れることがあり、これは以下の形式の式である:
|
(C99以降) | ||||||||||||||||||||||||||||||||||||
目次 |
説明
初期化子は、オブジェクトに格納される初期値を指定します。
明示的な初期化
初期化子が提供されている場合、以下を参照してください。
- scalar initialization スカラー型の初期化
- array initialization 配列型の初期化
- struct initialization 構造体および共用体型の初期化
暗黙の初期化
初期化子が提供されていない場合:
- 自動 storage duration を持つオブジェクトは不定値( trap representations となる可能性がある)に初期化される
- 静的およびスレッドローカルの storage duration を持つオブジェクトはゼロ初期化される
空初期化
|
オブジェクトが明示的に初期化子 = { } から初期化される場合、そのオブジェクトは空初期化されます。 |
(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
|
|
C++ documentation
for
Initialization
|