C/C++プログラムで発生するセグメンテーション違反とは?原因と対策を解説
セグメンテーション違反(Segmentation Fault)とは
セグメンテーション違反とは、プログラムがアクセスを許可されていないメモリ領域にアクセスしようとした際に発生するエラーです。言い換えれば、オペレーティングシステム(OS)がプログラムに割り当てたメモリ範囲を超えて、不正な領域を読み書きしようとしたときに起こります。
このエラーが発生すると、OSはプログラムを強制終了させるため、実行中のアプリケーションが突然クラッシュする原因となります。
セグメンテーション違反の主な原因
セグメンテーション違反は、主に以下のようなポインタの誤った扱いによって引き起こされます。
1. 初期化されていないポインタの使用
宣言だけで適切に初期化されていないポインタは、不定のアドレスを指しています。そのようなポインタを通じてメモリにアクセスすると、予期しない領域を操作してしまう可能性があります。
2. 解放済み・再割り当て済みメモリへのアクセス
free() や delete で解放した後、あるいはすでに別の用途に再割り当てされたメモリを指すポインタ(ダングリングポインタ)を使用すると、不正なメモリアクセスにつながります。
3. 配列の範囲外へのアクセス
添字(インデックス)を使って配列にアクセスする際、そのインデックスが配列の境界外にあると、確保されていないメモリ領域を参照することになり、セグメンテーション違反が発生します。
デバッグのヒント
セグメンテーション違反を特定するには、gdb(GNUデバッガ)や Valgrind などのツールを活用すると効果的です。コアダンプを出力する設定にしておけば、クラッシュ発生時のスタックトレースから問題箇所を素早く突き止められます。また、ポインタ使用前の必須チェックとして「NULL初期化」「解放後の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 を開き