
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言語の危険性を理解すること
- そして、制御できるようになること
でもあります。
この章を読み終える頃には、
「文字列、なんか怖い…」
ではなく、
「仕組みがわかっているから扱える」
と感じられるようになるはずです。
