143

次の方法で初期化した後、char配列に何が入るかわかりません。

1. char buf[10] = "";
2. char buf[10] = " ";
3.char buf[10] = "a";

ケース 2 については、 である必要があり、 である必要があり、 ~ からまでがランダムなコンテンツになると思いますbuf[0]。ケース 3 については、'\0' である必要があり、~ からはランダムなコンテンツになると思います。' 'buf[1]'\0'buf[2]buf[9]buf[0]'a'buf[1]buf[2]buf[9]

あれは正しいですか?

ケース 1 の場合、 には何が入りますbufか? buf[0] == '\0'からbuf[1]までbuf[9]はランダムなコンテンツになりますか?

4

6 に答える 6

36
  1. これらは同等です

    char buf[10] = "";
    char buf[10] = {0};
    char buf[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  2. これらは同等です

    char buf[10] = " ";
    char buf[10] = {' '};
    char buf[10] = {' ', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
  3. これらは同等です

    char buf[10] = "a";
    char buf[10] = {'a'};
    char buf[10] = {'a', 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
于 2014-09-29T16:15:36.927 に答える
30

編集:OP(または編集者)は、この回答を提供した後、元の質問の一重引用符の一部を二重引用符に静かに変更しました。

あなたのコードはコンパイラ エラーになります。最初のコード フラグメント:

char buf[10] ; buf = ''

二重に違法です。まず、C では空の などというものはありませんchar。次のように、二重引用符を使用して空の文字列を指定できます。

char* buf = ""; 

これにより、文字列へのポインターNUL、つまりその文字のみを含む単一文字の文字列が得られNULます。しかし、中に何もない単一引用符を使用することはできません。これは未定義です。NUL文字を指定する必要がある場合は、次のように指定する必要があります。

char buf = '\0';

文字 と区別するためにバックスラッシュが必要'0'です。

char buf = 0;

同じことを達成しますが、前者の方が読みにくいと思います。

第 2 に、配列を定義した後で配列を初期化することはできません。

char buf[10];

配列を宣言および定義します。配列識別子はメモリ内のアドレスになり、割り当てによってポイントをbuf変更することはできません。bufそう

buf =     // anything on RHS

違法です。このため、2 番目と 3 番目のコード フラグメントは違法です。

配列を初期化するには、定義時に行う必要があります。

char buf [10] = ' ';

最初の char がスペース'\040'で残りが. のNULような 10 文字の配列が得られます'\0'。配列が初期化子で宣言および定義されると、指定された初期値を持つ配列要素を超える配列要素 (存在する場合) は、自動的に で埋められ0ます。「ランダムなコンテンツ」はありません。

次のように、配列を宣言して定義するが、初期化しない場合:

char buf [10];

すべての要素にランダムなコンテンツが含まれます。

于 2013-09-08T22:20:20.907 に答える
12

C11 標準ドラフト n1570 6.7.9 初期化の関連部分には、次のように記載されています。

14 文字型の配列は、文字列リテラルまたは UTF-8 文字列リテラルで初期化することができ、オプションで中括弧で囲みます。文字列リテラルの連続するバイト (空きがある場合、または配列のサイズが不明な場合は、終端の null 文字を含む) は、配列の要素を初期化します。

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

したがって、十分なスペースがある場合は「\0」が追加され、残りの文字はstatic char c;関数内で初期化される値で初期化されます。

ついに、

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

[--]

  • 算術型の場合は、(正または符号なし) ゼロに初期化されます。

[--]

したがって、char算術型であるため、配列の残りの部分もゼロで初期化されることが保証されます。

于 2016-07-05T11:03:47.530 に答える
1

よくわかりませんが、通常は配列を "" に初期化します。その場合、文字列の null エンドについて心配する必要はありません。

main() {
    void something(char[]);
    char s[100] = "";

    something(s);
    printf("%s", s);
}

void something(char s[]) {
    // ... do something, pass the output to s
    // no need to add s[i] = '\0'; because all unused slot is already set to '\0'
}
于 2016-04-01T01:41:58.557 に答える