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 に代入し、文字列を表示する。このポインターから文字列リテラルを変更してはいけない。変更しようとした場合の動作は未定義である。