導入
C++の学習を始めたばかりの方が最初につまずきやすいポイントの一つが「文字列」の扱いです。C言語の流れを汲むC++では、文字列を文字配列として扱うことがありますが、その際に「なぜか配列のサイズが思っていたより大きい?」と疑問に思ったことはありませんか?
この記事では、文字配列の初期化の仕組みと、なぜ末尾に「終端文字」が必要なのかを解説します。これを理解することで、メモリ管理の基礎がしっかりと身につきます。
基礎知識
C++において、文字列リテラル(ダブルクォーテーションで囲まれた文字の並び)は、実は内部で「文字の配列」として処理されています。
重要なポイントは、終端文字(ヌル文字)と呼ばれる「\0」の存在です。C++では、文字列の終わりをプログラムに知らせるために、自動的に文字列の末尾へこの特殊な文字を付与します。つまり、「Hello」という5文字の文字列を格納するには、実は6文字分の領域が必要になるのです。
実装/解決策
文字配列を文字列で初期化する場合、配列のサイズを自分で指定することもできますが、省略することをおすすめします。コンパイラが自動的に文字数+終端文字分のサイズを計算してくれるため、記述ミスによるバグを防ぐことができます。
サンプルプログラム
以下のコードをコピーして、実際に実行してみてください。文字配列のサイズがどのように決まっているかを確認できます。
include
int main() {
// 文字列リテラルで初期化
// “Hello” は5文字ですが、末尾に \0 が付くためサイズは6になります
char str[] = “Hello”;
// sizeof を使うと配列の全バイト数(サイズ)を取得できます
std::cout << "配列の内容: " << str << std::endl;
std::cout << "配列のサイズ: " << sizeof(str) << std::endl;
// 終端文字を含める必要がある理由
// 文字列を扱う関数(std::coutなど)は \0 を見つけるまで文字を表示し続けます
return 0;
}
応用・注意点
現場で注意すべき点は、配列のサイズ不足によるバッファオーバーランです。
もし、文字配列のサイズを手動で「char str[5] = “Hello”;」のように指定してしまうと、5文字の「Hello」と終端文字「\0」の計6文字が入らず、メモリ破壊の原因となります。
また、C++で本格的な開発を行う場合は、文字配列よりも扱いが安全で便利なstd::stringクラスを使用するのが一般的です。学習段階では文字配列の仕組みを理解し、実務ではstd::stringを活用するという使い分けを心がけましょう。

コメント