今回は、「配列による文字列」と「ポインタによる文字列」の相違点についてご紹介しよう。
「ポインタによる文字列の書き換え」するプログラムである。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.0)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
//ポインタによる文字列の書き換え
#include <stdio.h>
int main(void)
{
char *p = "789";
puts("代入前の文字");
printf("*p = \"%s\"\n",p);
p = "123";
puts("代入後の文字");
printf("*p = \"%s\"\n",p);
return 0;
}
実行結果
代入前の文字
*p = "789"
代入後の文字
*p = "123"
これが、「配列による文字列」になると、結果は異なる。
char s[] = "ABC";
puts("代入前の文字");
printf("*p = \"%s\"\n",s);
p = "DEF"; //エラー
puts("代入後の文字");
printf("*p = \"%s\"\n",s);
「p = “DEF”;」は、エラーとなる。配列への代入は行えない。
ポインタによる文字列
代入前
ポインタpは、文字列リテラル”789″の先頭文字’7’を指すように初期化される。
代入後
代入の結果、ポインタpは、文字列リテラル”123″の先頭文字’1’を指すように更新される。
文字列をコピーしているのではない。ポインタpの指す先を別の文字列リテラルの先頭文字に更新している。
代入の結果、文字列リテラル”789″はどこからも指されなくなる。プログラムからアクセスできなくなるので、ゴミとなる。
(参考) 新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント