セグメンテーション違反 – 定義

セグメンテーション フォールト(略してセグメンテーション フォールトとも呼ばれます) は、割り当てられていないメモリ位置にアクセスしようとしたアプリケーションのクラッシュです。

アプリケーションの実行時には、オペレーティング システムによって割り当てられるRAM が必要です。アプリケーションに割り当てられると、他のアプリケーションはこの領域にアクセスできなくなります。これにより、各アプリケーションの 動作上の安全性が他のアプリケーションのエラーに対して保証されます。したがって、アプリケーションが、アプリケーションに割り当てられていないメモリ領域にわずかなアクセスを試みると、オペレーティング システムがそれを検出し、即座に実行を停止します。

セグメンテーションエラーの大部分は意図的なものではなく (意図的である場合、犯罪目的である可能性が高くなります)、アプリケーションの不適切な設計または実装が原因です。

プログラムが実行されると、オペレーティング システムがそのプログラムにメモリを割り当てます。ただし、アプリケーションの実行中に、処理ニーズのために追加のメモリが必要になる場合があります。次に、オペレーティング システムに一定のメモリを割り当てるように要求します。このメモリを使用するかどうか、また、割り当てられたメモリ領域の外で読み書きしないように注意するかどうかはアプリケーションの責任になります。

問題は、この記憶を使用するときに自分がどこにいるのかを知ることです。そのとき、注意を怠るとメモリがオーバーフローしてしまい、アプリケーションが終了してしまいます。これはバッファオーバーフローと呼ばれます。

セグメンテーション違反のもう 1 つの原因は、ポインタの初期化が正しくないことです。後者は任意のメモリ領域を指し、使用される場合、後者にはアプリケーションに割り当てられていないアドレスが含まれる可能性が高くなります。前と同様、これはオペレーティング システムが生成するセグメンテーション違反です。

セグメンテーション違反 - 定義

セグメンテーション違反を生成するプログラム

このようなエラーが発生する可能性のある C プログラムの例を次に示します。

#含む
void main() {
int 整数変数;
scanf("%d", integer_variable);
}

「scanf」関数は、標準入力 (通常はキーボード) から整数を取得し、この値を変数に格納することを目的としています。データをそこに保存できるようにするには、「scanf」は変数 (この場合は integer_variable) のアドレスを知っている必要があります。ただし、この例では integer_variable の値を渡しますが、これは初期化されていないため、任意の値を持ちます。

次に、「scanf」関数は、integer_variable に含まれる値で表されるメモリ領域へのアクセスを試み、(少なくとも非常に高い確率で) セグメンテーション違反を引き起こします。

置き換える必要がありました:

scanf("%d", integer_variable);

による :

scanf("%d", &integer_variable);

そのため、プログラムは私たちが望むように動作します。

セグメンテーション違反 - 定義
  1. Falla de segmentació – catalan
  2. Porušení ochrany paměti – tchèque
  3. Schutzverletzung – allemand
  4. Segmentation fault – anglais
  5. Violación de acceso – espagnol
  6. Muistialueen ylitys – finnois

セグメンテーション違反 – 定義・関連動画

サイエンス・ハブ

知識の扉を開け、世界を変える。