C言語入門|Cにおける文字列の本質

これでやっと、バトルRPG開発に取りかかれる……!
そう思った人も多いかもしれませんね。

でも、その前にもうひとつ。
C言語で文字列を扱う覚悟は、できていますか?

一部の特殊な開発を除けば、
文字列を使わないプログラムはほぼ存在しません。
むしろ、入力・表示・ファイル・通信など、
至るところで文字列操作が登場します。

だからこそ、
文字列を「なんとなく」で扱うか、
「仕組みを理解して」扱うかで、
C言語での開発体験は大きく変わります。

C言語特有の「文字列の怖さ」

第10章で、メモリアクセスの自由さと危険性を学びましたね。

文字列は、その 危険性が最も凝縮された存在 です。

  • 配列のサイズを1文字でも見誤る。
  • 終端を意識し忘れる。
  • コピーや結合を軽く考える。

たったそれだけで、
オーバーランが発生し、
本来アクセスしてはいけないメモリ領域を
読み書きしてしまいます。

その結果として起きるのは、

  • プログラムの強制終了
  • 原因不明の異常動作
  • 最悪の場合、セキュリティホール

第10章で学んだ内容が、
ここで一気に現実味を帯びてくるのです。

不安なまま使う文字列が一番危険

「文字列はよく使うけど、正直よくわからない」
「char 配列だとは聞いたけど、それ以上は…」

この状態で文字列を扱い続けると、

  • 常に不安
  • デバッグが地獄
  • 開発効率が下がる。

という悪循環に陥ります。

だからこそ第11章では、
文字列を自信を持って扱える状態
になることを目標にします。

文字列と char 配列は同じ? 違う?

ここで、よくある疑問が出てきます。

「でも、文字列って結局 char 配列なんですよね?」
「配列のからくりも学んだし、もう大丈夫では?」

半分正解で、半分不正解です。

物理的な正体は同じ

まず事実から整理しましょう。

第10章までを学んだ皆さんであれば、
これまで使ってきた文字列変数の正体が、

char 型の配列として、連続したメモリ領域に確保されている

ことは、もう理解できているはずです。

次のコードを見てください。

サンプルプログラム

プロジェクト名:11-1-1 ソースファイル名: sample11-1-1.c

#include <stdio.h>

typedef char String[1024];

int main(void)
{
    char scores[1024] = {85, 90, 78};
    String message = "welcome";

    printf("%s\n", message);
    return 0;
}

実行結果

welcome

この2つの変数は、

  • scores
  • message

どちらも 1024バイトの連続したメモリ領域 です。

物理的な姿だけを見れば、まったく同じです。

それでも意味はまったく違う

では、何が違うのでしょうか。

私たちは、

  • scores を
    → 複数の数値を並べて入れる箱
  • message を
    → 1つの文字列を入れる箱

として 意味づけして使っています

ここが、非常に重要なポイントです。

char 配列の2つの用途

char 配列は、
あくまで メモリを確保するための手段 です。

その上で、使い方には大きく2種類があります。

用途①:数値を並べて入れる

  • 小さな数値を配列として管理する
  • char を「1バイト整数」として使う

これは、配列としての使い方です。

用途②:文字列として使う

  • 文字を並べて
  • 特別なルールに従って
  • 1つの「文字列」として扱う

これが、文字列としての使い方です。

文字列は「用途」であって「型」ではない

ここで、C言語における重要な考え方が見えてきます。

文字列は型ではない
char 配列の使い方(文化)である

C言語には、

  • String 型
  • string 型

といった、
文字列専用の安全な型は存在しません。

だからこそ、

  • どこまでが文字列なのか
  • どこで終わるのか
  • どの関数を使うのか

を、すべてプログラマが理解して管理する必要があります。

11章で学ぶこと

この章では、

  • なぜ文字列が危険なのか
  • どんなルールで扱われているのか
  • どうすれば安全に操作できるのか

を、
メモリの視点から一貫して解説していきます。

第10章で学んだ、

  • ポインタ
  • 配列
  • メモリアクセス

の知識が、
ここで一気に「実戦的な武器」へと変わります。

文字列を理解できたとき、C言語は怖くなくなる

文字列を理解するということは、

  • C言語の危険性を理解すること
  • そして、制御できるようになること

でもあります。

この章を読み終える頃には、

「文字列、なんか怖い…」
ではなく、

「仕組みがわかっているから扱える」

と感じられるようになるはずです。