C/C++のセグメンテーション違反とは?主な原因と対処法を解説
セグメンテーション違反(Segmentation Fault)とは
セグメンテーション違反(通称:セグフォルト)とは、プログラムがアクセスを許されていないメモリ領域にアクセスしようとした際に発生するエラーです。具体的には、OSがプログラムに割り当てたメモリ範囲を超えた領域を読み書きしようとしたときに起こります。
このエラーが発生すると、OSはプログラムにSIGSEGVシグナルを送信し、通常はプログラムが強制終了されます。CやC++ではメモリを直接操作できるため、他の言語に比べてこの種のエラーが発生しやすいという特徴があります。
セグメンテーション違反の主な原因
セグメンテーション違反の多くは、ポインタの不適切な扱いによって引き起こされます。代表的な原因は以下の3つです。
1. 初期化されていないポインタの使用
宣言だけで値を代入していないポインタには、不定のアドレス(ガベージ値)が格納されています。そのまま逆参照すると、意図しないメモリ領域にアクセスしてしまいます。ポインタは宣言時にNULLで初期化する習慣をつけましょう。
2. 解放済み・再割り当て済みメモリへのアクセス
free()やdeleteで解放した後、あるいはメモリが再割り当てされた後も同じポインタを使い続けると、不正なメモリアクセスにつながります(ダングリングポインタ)。メモリ解放後はポインタにNULLを代入しておくと安全です。
3. 配列の範囲外インデックスへのアクセス
配列の要素数を超えるインデックスでアクセスすると、配列外のメモリ領域を読み書きすることになります。ループの終了条件やインデックス計算を見直し、境界チェックを徹底することが重要です。
デバッグ・防止のためのヒント
- gdbなどのデバッガでバックトレースを確認し、クラッシュ発生箇所を特定する
- ValgrindやAddressSanitizerを活用してメモリ関連のバグを検出する
- ポインタは必ず初期化し、メモリ解放後はNULLを代入する
- 配列アクセス時はインデックスが有効範囲内にあるか必ず確認する
セグメンテーション違反は一見難解なエラーに見えますが、原因のパターンを理解し、適切なデバッグツールを活用すれば効率的に特定・解決できます。
-
C/C++による線形探索プログラムの実装方法を解説
線形探索とは線形探索(リニアサーチ)アルゴリズムでは、目的の要素を配列の各要素と先頭から順番に比較していきます。該当する要素が見つかれば、その位置を出力します。線形探索の最悪計算量は O(n) です。入力: arr[] = { 12, 35, 69, 74, 165, 54} 探索値 = 165 出力: 165 は位置 5 に存在します。アルゴリズムの解説線形探索は、指定された数値が配列内に存在するかどうか、存在する場合にはどの位置にあるのかを調べるための基本的な探索アルゴリズムです。「逐次探索」と呼ばれることもあります。その動作は非常にシンプルで、以下の手順で行われます。配列の先頭要素から順
-
C/C++でn番目のカタラン数を求めるプログラム
カタラン数(Catalan numbers)とは、組み合わせ論におけるさまざまな数え上げ問題に現れる自然数の数列です。特に、再帰的に定義される対象の個数を数える場面で頻繁に登場することで知られています。カタラン数の主な性質ディック語(Dyck word)との関係Cn は、長さ 2n のディック語の総数を表します。ディック語とは、n 個の X と n 個の Y から構成され、文字列のどの先頭部分を見ても Y の数が X の数を超えない文字列のことです。例えば、長さ 6 のディック語は次の通りです。XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY.正しい括弧の対応付けX を開き