C言語のデバッグ方法。printfデバッグとよくあるバグの見つけ方を実践的に解説。
ファイル名:行番号:列番号: error: 内容 の形式で出力されます。最初のエラーから順に直すのがコツです。; の付け忘れ。エラーの行の1行前を確認しましょう。int x = 10 // ← ; が無い! printf("%d", x);
#include の忘れ。%fにdoubleを渡すべきところで%dを使った等。printf で出力し、プログラムの挙動を追跡する方法です。初心者でもすぐに使えます。// テク1: 変数の値を確認 printf("DEBUG: x=%d, y=%d\n", x, y); // テク2: ここまで来たか確認(通過チェック) printf("DEBUG: ループ前に到達\n"); // テク3: ループ内の変数をステップごとに表示 for (int i = 0; i < n; i++) { printf("DEBUG: i=%d, sum=%d\n", i, sum); sum += a[i]; } // テク4: 条件分岐のどちらに入ったか if (x > 0) { printf("DEBUG: xは正\n"); } else { printf("DEBUG: xは0以下\n"); }
i は何から始まっていますか? a[5] は存在しますか?i=0 から始めるべきところを i=1 にした、i<n を i<=n にした等。// NG: a[5]にアクセスしてしまう(配列外) for (int i = 0; i <= 5; i++) sum += a[i]; // OK: for (int i = 0; i < 5; i++) sum += a[i];
int sum; // ← 初期値はゴミ! for (...) sum += a[i]; // ゴミ + a[i] = ? // 正しくは: int sum = 0;
if (x = 5) は代入してしまう(常にtrue)。比較は == を使う。if (x = 5) // NG: xに5を代入(常にtrue) if (x == 5) // OK: xが5と等しいか比較
int i = 0; while (i < 10) { printf("%d\n", i); // i++ を忘れた!→ 永遠に i=0 }
scanf("%d", x) ではなく scanf("%d", &x)。アドレスを渡さないとクラッシュ。scanf("%d", x); // NG: クラッシュ! scanf("%d", &x); // OK
平均 = 5.00」になるようにしてください。この講座の理解度をチェックしましょう!
printf で変数の値や実行経路を出力することで、バグの原因箇所を特定できます。最も基本的なデバッグ手法です。
デバッガではブレークポイントの設定、ステップ実行、変数の監視など、詳細なプログラム解析が可能です。
少しずつ書いてこまめにテストすることで、バグの発生箇所を素早く特定できます。コメントも重要です。