C 言語 | ポインター | 文字列ポインター
文字配列と文字列へのポインターについて説明する。文字列リテラルはポインター経由で変更してはいけない。文字列リテラルを基に編集する場合は、配列にコピーする。
文字列リテラルへのポインター
配列を文字列リテラルで初期化すると、文字列を配列に保存できる。それでは、初期化以外の式で文字列リテラルを指定した場合、どのように扱われるのだろうか。文字列リテラルは、その文字列へのポインターとして評価される。
たとえば、printf("Kitty on your lap") は printf() 関数に char * 型の値を渡していると考えられる。この文字列はどこに保存されるのだろうか。
文字列リテラルや数値などの定数は、コンパイル時にバイナリーデータへ変換され、実行ファイルに保存される。プログラムを実行すると、そのデータが定数としてメモリーに読み込まれる。具体的な保存方法や読み込み方法は、コンパイラーとシステムに依存する。
文字列リテラルは実行時にすでにメモリー上にあるため、別の配列にコピーする意味があるのは文字単位で編集する場合である。目的に応じて、リテラルへのポインターを使うか、配列にコピーするかを選択する。
char chStr[] = "Kitty on your lap";
この文は文字列リテラルを新しい配列 chStr にコピーする。作成した配列を編集する場合に有効である。単に文字列を指す変数が必要なだけなら、配列にコピーする必要はない。
char *chpStr = "Kitty on your lap";
これは配列の初期化とは大きく異なる。chStr[] = "..." は文字列を保存できる大きさの配列を確保し、リテラルをコピーする。一方、*chpStr = "Kitty on your lap" は、実行ファイルからメモリーに読み込まれた文字列リテラルのアドレスを代入する。
コード 1
#include <stdio.h>
int main() {
char *chpStr = "Kitty on your lap";
printf("%s\n" , chpStr);
return 0;
}
コード 1 は文字列リテラル "Kitty on your lap" のアドレスを chpStr に代入し、文字列を表示する。このポインターから文字列リテラルを変更してはいけない。変更しようとした場合の動作は未定義である。