C言語のSegmentation Faultの原因と対処法。実行時エラーを完全解説。
x / 0)で発生。Segmentation fault (core dumped) はC言語初心者が最も遭遇するエラーです。「触ってはいけないメモリに触った」という意味です。int a[5]; a[10] = 99; // a[0]〜a[4]しかないのにa[10]に書き込み→即死 // よくあるパターン: ループの境界ミス for (int i = 0; i <= 5; i++) // i=5でa[5]にアクセス→NG a[i] = i;
int *p = NULL; *p = 10; // NULLが指すアドレスに書き込み→Segfault // 対策: 使う前にNULLチェック if (p != NULL) { *p = 10; }
int x; scanf("%d", x); // NG: xの「値」をアドレスとして使う→暴走 scanf("%d", &x); // OK: xの「アドレス」を渡す
int *p; // 初期化していない→ゴミアドレスが入っている *p = 42; // ゴミアドレスに書き込み→Segfault // 対策: 必ず初期化するか、mallocで確保してから使う
int fact(int n) { return n * fact(n - 1); // 終了条件がない→永遠に呼び続ける→スタック溢れ } // 対策: if (n <= 1) return 1; を追加
char name[5]; strcpy(name, "HelloWorld"); // 5バイトしかないのに10文字+\0→溢れる // 対策: strncpy(name, "Hello", sizeof(name)-1);
mallocで確保したメモリをfreeし忘れると、使えないメモリが溜まり続ける。int *p = malloc(sizeof(int) * 100); // ... pを使う ... // free(p); を忘れた → メモリリーク
free(p); *p = 10; // 解放済みメモリに書き込み→未定義動作 free(p); // 二重free→クラッシュの可能性 // 対策: free後に p = NULL; とする
int a = 7, b = 2; double avg = a / b; // → 3.000000(3.5にならない!) double avg = (double)a / b; // → 3.500000(OK)
if (x & 1 == 0) // → x & (1==0) と解釈される(意図と違う!) if ((x & 1) == 0) // → OK: カッコで明示
switch (n) { case 1: printf("一\n"); // break無し→case 2もcase 3も実行される case 2: printf("二\n"); case 3: printf("三\n"); }
if (x > 0); // ← この ; で if文が終了してしまう { printf("正の数\n"); // ← 常に実行される! }
A. コンパイルエラーはコンパイル中に検出される文法的な問題で、実行ファイルが作られません。実行時エラーはプログラムが実行中に発生する問題で、コンパイルは通りますがプログラムが強制終了します。実行時エラーの方が検出が難しいのが特徴です。
A. セグメンテーション フォルト(Segfault)は不正なメモリアクセスが原因です。主な原因は:1. NULLポインタへのアクセス、2. 解放済みメモリへのアクセス、3. 配列の範囲外アクセス、4. スタックオーバーフローです。ポインタやメモリ管理を見直しましょう。
A. 1. ループ条件を確認し、終了条件が正しいか見直す。2. printf()で変数値を出力して、どこで値が想定と異なるかを追跡する。3. ステップ実行でデバッガを使うのも効果的です。無限ループの多くはループ条件やインクリメント処理の誤りが原因です。
A. メモリ破壊は症状が遠く離れた場所に現れるため、発見が難しいです。有効な手段は:1. valgrindツールを使う(Linux/Mac)、2. Ubsan/Asanなどのサニタイザーを有効にする、3. 配列やポインタの使用を慎重に見直すことです。
この講座の理解度をチェックしましょう!
NULLポインタの参照、配列の範囲外アクセス、解放済みメモリの使用などが原因です。コンパイル時には検出されません。
整数の 0 除算は実行時エラーになります。変数で割る場合は事前に 0 でないかチェックしましょう。
無限ループは終了条件が満たされないために発生します。カウンタ変数の更新忘れや条件式の間違いを確認しましょう。