「文字列データ」

文字列の配列

文字列の配列は文字型の2次元配列として実現することが出来る。
以下のサンプルコードのようにし て、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"

この場合、文字列と配列の関係は以下のようになっている。
2次元配列の2次元目の添字(左側の添字)で文字列を指し、 1次元目の添字(右側の添字)で文字列中の各文字を指すことになる。

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で扱う。


文責:石川