char
型配列 「char
の配列」を使えば,文字列を扱うことができます。配列型を含む集成体型の初期化には { }
を使うことを 9.1 で見ましたが,char
型配列に限り,初期化子に 2.1 で見た文字列リテラルも使用できます[C11(旧C99)§6.7.9, 14]。 例えば,"ABCDE" という文字列を扱うには,
char str[8] = {'A', 'B', 'C', 'D', 'E'};
といった文字定数(付録4.A)を使った初期化や,ASCIIコードより,
char str[8] = {65, 66, 67, 68, 69}; char str[8] = {0x41, 0x42, 0x43, 0x44, 0x45};
といった整数定数(付録4.A)を使った初期化がありますが,
char str[8] = "ABCDE";
のように文字列リテラルを使った初期化も可能です。文字定数は文字列リテラルに使えるので,
char str[8] = "\x41\x42\x43\x44\x45";
も又,文字列 ABCDE を意味します。
/* Example 9.3 */ #include <stdio.h> int main(void) { char str[] = "language"; size_t i; printf("sizeof(str) = %zd\n\n", sizeof(str)); printf("\t%%c\t%%d\t%%x\n"); for(i = 0UL; i < sizeof(str); i++) printf("str[%ld]\t%c\t%d\t%x\n", i, str[i], str[i], str[i]); return 0; }
実行結果です。
sizeof(str) = 9 %c %d %x str[0] l 108 6c str[1] a 97 61 str[2] n 110 6e str[3] g 103 67 str[4] u 117 75 str[5] a 97 61 str[6] g 103 67 str[7] e 101 65 str[8] 0 0
先ず,配列宣言子 str[]
自体は要素数の指定がないため,3.3 で見た不完全型ですが[C11(旧C99)§6.2.5, 22],初期化されれば不完全型とはなりません[C11(旧C99)§6.7.9, 22]。 その証拠として,「4.5. 変数のサイズ」で見た sizeof
演算子で配列 str[]
のサイズを調べると,
sizeof(str) = 9
と出ます。すなわち,値を記憶するためのメモリ領域の大きさが確定しています。
初期化に用いた文字数は language
の8文字です。しかしながら,sizeof(str) = 9
なので,メモリは9バイト,すなわち,9文字分のメモリ領域が割り当てられています。実は,文字列の末尾を表すためにナル文字(null文字,空文字,null character;4.A 参照 )が最後の9文字目 str[8]
に代入されているのです[C11(旧C99)§6.7.9, 14]。 上の出力結果でも,str[8]
に 0
が入っているのが確認できます。
上では,配列のサイズを指定せずに初期化しました。もし配列の要素数を指定するのであれば,ナル文字が入るようにサイズを大きくとります。
char str[9] = "language";
配列の要素数より初期化での指定数が少なければ,残りに 0
が入るのは 9.1 で見た通りです。