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 で見た通りです。