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 }
int型を0で割ると、Cはこれを例外として捕まえられずプロセスごと強制終了します。countが0になり得る場合は、割る前に0でないことを確認する必要があります。
直し方: 0 を 2 にします。
パターン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」という1行が表示されるだけで、原因の行番号すら分かりません。
直し方: 0 を 3 にします。
パターン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 }
4 - 4は0になるため、divisorが0のままscore / divisorが実行され、実行時エラーになります。
直し方: - を + にします。
パターン4
1 #include <stdio.h> 2 3 int main(void) { 4 int budget = 500; 5 int teams = 0 ; ^ 6 printf("%d\n", budget / teams); 7 return 0; 8 }
int型の0除算はコンパイルも通ってしまい、実行時にプロセスごと強制終了します。
直し方: 0 を 5 にします。
パターン5
1 #include <stdio.h> 2 3 int main(void) { 4 int stock = 40; 5 int boxes = 5 - 5; ^ 6 printf("%d\n", stock / boxes); 7 return 0; 8 }
5 - 5は0になるため、boxesが0のままstock / boxesが実行され、実行時エラーになります。
直し方: - を + にします。
よくある誤解
「エラーメッセージが出るはず」という期待は裏切られます。Java/Pythonのように例外オブジェクトや詳細なメッセージは出ず、シェルがプロセスの異常終了を検知して短い1行を表示するだけです。プログラム自身は何も出力しません。
実務での勘所
「Floating point exception」というメッセージは、実は名前に反して浮動小数点とは無関係です。これはUnix系OSがプロセスに送るSIGFPEというシグナルの名称で、歴史的にCPUの演算例外全般(整数のゼロ除算も含む)をまとめてこの名前で扱ってきた名残です。x86系のCPUは整数のゼロ除算を検出すると、ハードウェアレベルの割り込み(Divide Error)を発生させ、OSがそれを受け取ってプロセスにSIGFPEを送ってプログラムを強制終了させます。整数の演算で起きたクラッシュなのに「浮動小数点」という名前が付いているのは、このためです。