15

Cでは、構造体または配列を部分的に初期化できます。その結果、初期化子で言及されていないメンバー/要素はゼロで初期化されます。(C99セクション6.7.8.19)。例えば:-

int a[4] = {1, 2};
// a[0] == 1
// a[1] == 2
// a[2] == 0
// a[3] == 0

文字列リテラル(C99セクション6.7.8.14)を使用して「文字タイプの配列」を初期化したり、「連続する文字...配列の要素を初期化する」こともできます。例えば:-

char b[4] = "abc";
// b[0] == 'a'
// b[1] == 'b'
// b[2] == 'c'
// b[3] == '\0'

すべて非常に簡単です。しかし、配列の長さを明示的に指定しても、配列を埋めるには短すぎるリテラルを使用するとどうなりますか?残りの文字はゼロで初期化されていますか、それとも未定義の値がありますか?

char c[4] = "a";
// c[0] == 'a'
// c[1] == '\0'
// c[2] == ?
// c[3] == ?

それを部分的な初期化子として扱うことは理にかなっており、char c[4] = "a"まったく同じようchar c[4] = {'a'}に動作し、文字配列全体を簡潔にゼロ初期化できるという便利な副作用がありますchar d[N] = ""が、それが何であるかは私にはまったくわかりません仕様に必要です。

4

3 に答える 3

15
 char c[4] = "a";

配列の残りの要素はすべて に設定され0ます。つまり、 だけでc[1]なくc[2]c[3].

これは の保存期間に依存しないことに注意してくださいc。つまり、c自動保存期間がある場合でも、残りの要素は に設定され0ます。

C標準から(強調鉱山):

(C99, 6.7.8p21) 「中括弧で囲まれたリスト内の初期化子の数が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字数が、要素の数よりも少ない場合。配列の場合、集合体の残りの部分は、静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。

于 2012-08-02T15:27:24.050 に答える
8

C99標準から(すでにouahで述べられているように):

集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

と:

自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合:

  • ポインター型の場合は、null ポインターに初期化されます。
  • 算術型の場合は、(正または符号なし) ゼロに初期化されます。
  • 集合体の場合、すべてのメンバーはこれらの規則に従って (再帰的に) 初期化されます。
  • 共用体の場合、最初に指定されたメンバーは、これらの規則に従って (再帰的に) 初期化されます。

Andcharは算術型であるため、配列の残りの要素はゼロに初期化されます。

于 2012-08-02T15:36:52.963 に答える
3

Absolutely everywhere in C language it follows the all-or-nothing approach to initialization. If you initialize an aggregate only partially, the rest of that aggregate gets zero-initialized.

One can say that this is excessive and less than optimal with strings, but that's just how it works in C.

于 2012-08-02T15:54:29.117 に答える