文字列の配列は文字型の2次元配列として実現することが出来る。
以下のサンプルコード(string-array-test.c)のようにして、char型の2次元配列を宣言し、文字列の配列を作ることができる。
ただしこの場合、配列の1次元(右側の添字)側のサイズ(つまり、文字列の最大長。この例では6)を明示的に指定する必要がある。2次元(左側の添字)側のサイズ(つまり、文字列がいくつあるか)については、コンパイラが自動的に計算してくれる。
#include <stdio.h>
char str_array[][6] = {"Red", "Green", "Blue", "Black", "White" };
int
main(void)
{
int i;
for (i = 0; i < 5; i++)
printf("%d: ¥"%s¥"¥n", i, str_array[i]);
return 0;
}
実行結果は以下のようになる。
0: "Red"
1: "Green"
2: "Blue"
3: "Black"
4: "White"
上記のコードをコンパイル・実行し、動作確認してください。
また、文字列と配列の関係を出力するようにプログラムを修正してください。
printf("\\0\n")
)str_array[0][0] = R
str_array[0][1] = e
str_array[0][2] = d
str_array[0][3] = \0
str_array[0][4] = \0
str_array[0][5] = \0
str_array[1][0] = G
str_array[1][1] = r
str_array[1][2] = e
str_array[1][3] = e
str_array[1][4] = n
str_array[1][5] = \0
str_array[2][0] = B
str_array[2][1] = l
str_array[2][2] = u
str_array[2][3] = e
str_array[2][4] = \0
str_array[2][5] = \0
(以下略)
下図に示す通り、2次元配列はメモリ上では連続して配置されるが、1次元(右側の添字)のサイズが決まらないと配置できない。文字列の最大長を明示的に指定する必要がある理由はこのためである。
文字列の長さは実際に入力する時まで分からない場合が多いため、長い文字列が入力されても問題が出ないように配列のサイズを大き目にしておく必要があるが、文字列の配列を使った場合には配列中で使われないままの部分が多くなりメモリの無駄使いとなることがある。
そのため、複数の文字列を配列で扱う必要がある場合は、文字列を格納するための領域を必要なサイズ分だけ動的に確保する方がメモリの利用効率が良い。動的なデータ構造に関しては本演習の課題2で扱う。