上級のC言語エラー 27問
9種類のエラーを、それぞれ複数パターンずつ収録しています。
- free(): double free detected in tcache の原因と直し方同じポインタに対してfree()を2回呼び出したときに検出されるエラーです。メモリ管理システムが不整合を検知して強制終了します。
- Assertion failed の原因と直し方assert()に渡した条件式がその場でfalseになったときに強制終了するマクロです。「本来ありえないはずの状態」を検出するために使われます。
- Segmentation fault(再帰関数の終了条件忘れによるスタックオーバーフロー)再帰関数に正しい終了条件(ベースケース)が無いと、関数呼び出しのたびにスタック領域が積み上がり続け、上限に達した時点でクラッシュします。
- error: invalid type argument of unary '*'(関数ポインタ呼び出しの優先順位)*fp(a, b)と書くと、関数呼び出し()の方が間接参照*より優先順位が高いため、fp(a, b)を先に呼び出してからその戻り値に*を適用しようとしてしまいます。
- error: invalid type argument of '->' の原因と直し方構造体そのものの変数に対して->を使おうとしたときに出るエラーです。->は構造体へのポインタ専用の演算子です。
- 0.1 + 0.2 == 0.3 が偽になる理由doubleやfloatは2進数で値を表現するため、0.1や0.2のような小数を正確には表現できません。==でぴったり比較すると、ほぼ確実に一致しません。
- free()した後のポインタを使っても動いてしまう(use-after-free)free()で解放したメモリに対して読み書きを続けても、多くの場合その場ではクラッシュせず、直前まで入っていた値がそのまま読めてしまいます。
- Segmentation fault(配列の範囲外への書き込み)配列の宣言サイズを大きく超えた添字に書き込むと、プロセスに割り当てられていないメモリ領域に触れてクラッシュします。
- static付きローカル変数が関数呼び出しをまたいで値を保持し続ける関数内でstaticを付けて宣言した変数は、関数を抜けても値が消えません。次回その関数が呼ばれたときも、前回の値から処理が続きます。