Code Fix

初級

Floating point exception(整数のゼロ除算)

int型を0で割ったときに発生するクラッシュです。Cはこれを例外として捕まえられず、プログラムはその場で強制終了します。

エラーメッセージの読み方

Floating point exception
(エラーメッセージなし)
これはプログラム自身の出力ではありません。プログラムは何も言わずに落ちています
Floating point exception
シェルが検知した異常終了の種類 — OSが「不正なメモリアクセス」などを検出しプロセスを強制終了させました
見つけ方
このメッセージだけでは行番号すら分かりません。原因はコードを読んで特定するしかありません

このエラーが出る典型パターン

パターン1

 1  #include <stdio.h>
 2  
 3  int main(void) {
 4      int total = 10;
 5      int count = 0 ;
                     ^
 6      printf("%d\n", total / count);
 7      return 0;
 8  }
Floating point exception

int型を0で割ると、Cはこれを例外として捕まえられずプロセスごと強制終了します。countが0になり得る場合は、割る前に0でないことを確認する必要があります。

直し方: 02 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  #include <stdio.h>
 2  
 3  int main(void) {
 4      int items = 9;
 5      int groups = 0;
                     ^
 6      printf("%d\n", items / groups);
 7      return 0;
 8  }
Floating point exception

ゼロ除算のクラッシュに例外メッセージは出ません。シェルが検知した「Floating point exception」という1行が表示されるだけで、原因の行番号すら分かりません。

直し方: 03 にします。

この問題を解いてみる →

パターン3

 1  #include <stdio.h>
 2  
 3  int main(void) {
 4      int score = 88;
 5      int divisor = 4 - 4;
                        ^
 6      printf("%d\n", score / divisor);
 7      return 0;
 8  }
Floating point exception

4 - 4は0になるため、divisorが0のままscore / divisorが実行され、実行時エラーになります。

直し方: -+ にします。

この問題を解いてみる →

よくある誤解

「エラーメッセージが出るはず」という期待は裏切られます。Java/Pythonのように例外オブジェクトや詳細なメッセージは出ず、シェルがプロセスの異常終了を検知して短い1行を表示するだけです。プログラム自身は何も出力しません。

まとめ

Floating point exception(整数のゼロ除算)は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)