C言語学習ポータル(無料版) 学習コンテンツ つまずきとエラー scanf で & を付け忘れる

🚪 はじめてのC

scanf で & を付け忘れる

どんなときに起きるか

scanf("%d", n); と書くと gcc は warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=]。実行して数値を入力した瞬間に Segmentation fault (core dumped) で落ちます。

なぜそうなるのか

scanf は「読み取った値を書き込む先の番地」を必要とします。n を渡すと、n に入っている値(未初期化ならゴミの数値)を番地とみなして、そこへ書き込みにいきます。

直し方・再発防止

scanf("%d", &n); のように & で番地を渡します。ただし char s[32] のような配列名は、それ自体が先頭番地なので & は不要です(scanf("%31s", s))。警告の段階で気づけるよう -Wall を常用します。

scanfの恐怖(4コマ漫画)
4コマで見る「scanfの恐怖」

アプリでしっかり学ぶ(無料・登録不要) つまずき一覧へ

同じ場面で起きやすいつまずき

セミコロンの書き忘れerror: expected ';' before 'printf' や error: expected ';… scanf のあとに改行が残るscanf("%d", &age); の次に置いた scanf("%c", &c) や fgets が、入力を待… printf の書式指定子と型が合っていないprintf("%d\n", 3.14); が 0 や意味不明な数を表示します。printf("%s\n", 5…

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH