Cで文字列の配列を作成する方法はいくつかあります。すべての文字列が同じ長さになる(または少なくとも同じ最大長になる)場合は、charの2次元配列を宣言し、必要に応じて割り当てるだけです。
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
イニシャライザのリストを追加することもできます。
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
これは、初期化子の文字列のサイズと数が配列の次元と一致することを前提としています。この場合、各文字列リテラル(それ自体がゼロで終了するcharの配列)の内容が、strsに割り当てられたメモリにコピーされます。このアプローチの問題は、内部の断片化の可能性です。5文字以下の99個の文字列があるが、20文字の長さの1つの文字列がある場合、99個の文字列には少なくとも15個の未使用の文字が含まれます。それはスペースの無駄です。
charの2次元配列を使用する代わりに、charへのポインタの1次元配列を格納できます。
char *strs[NUMBER_OF_STRINGS];
この場合、文字列へのポインタを保持するためにメモリを割り当てただけであることに注意してください。(静的配列として、または使用のいずれかによって、それ自体が他の場所に割り当てられなければならない文字列のメモリmalloc()
又はcalloc()
)。前の例のようにイニシャライザリストを使用できます。
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
文字列定数の内容をコピーする代わりに、それらへのポインタを格納するだけです。文字列定数は書き込みできない場合があることに注意してください。次のように、ポインタを再割り当てできます。
strs[i] = "bar";
strs[i] = "foo";
ただし、文字列の内容を変更できない場合があります。つまり、
strs[i] = "bar";
strcpy(strs[i], "foo");
許可されない場合があります。
を使用malloc()
して、各文字列にバッファを動的に割り当て、そのバッファにコピーできます。
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
ところで、
char (*a[2])[14];
charの14要素配列へのポインタの2要素配列としてaを宣言します。
char (*a[2])[14]
14文字の配列への2つのポインタの配列です。