法大奥山研究室

 previous  contents

9.2. 文字列と 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 で見た通りです。


 previous  contents