2

次のコードを見てください。

#include<stdio.h>

int main(void)
{
    char name[7]={'E','R','I','C'};
    printf("%s",name);
}

name ERIC全体を出力します。なぜそうなのか?次のよう%sに文字配列を初期化する場合にのみ機能するはずではありませんname:

    char name[7]={'E','R','I','C','\0'};   //With NULL terminator

これは明らかにヌル終了文字配列を想定しているため、次のことは考慮していません。

   char name[7]="ERIC"
4

2 に答える 2

5

c11仕様によると

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

(6.7.9.10) 静的またはスレッド保存期間を持つオブジェクトが明示的に初期化されていない場合:

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

したがって、次のように配列を初期化すると:

char name[7]={'E','R','I','C'};

以下と同じです。

char name[7]={'E','R','I','C', 0, 0, 0};

そのためname、まだ null で終了しています。

于 2013-05-05T08:10:27.933 に答える