首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言 if-else 與 scanf 常見錯誤:缺少取址運算子

     編輯:C 語言問答

C 語言除錯筆記:scanf 忘記加取址符 & 導致無輸出

初學者常遇到:程式能編譯執行,輸入資料後卻完全沒有輸出結果,甚至直接結束。

錯誤程式碼

#include <stdio.h>

int main() {
    float x;
    printf("請輸入一個數字: ");
    scanf("%f", x);  // ❌ 錯誤:缺少取址運算子 &
    if (x > 0) printf("正數\n");
    else if (x < 0) printf("負數\n");
    else printf("零\n");
    return 0;
}

錯誤原因

  • scanf("%f", x) 將變數 x 的值 (未初始化的亂碼) 當作記憶體位址傳遞給 scanf。
  • scanf 嘗試寫入該亂碼位址,導致未定義行為 (通常是存取違規崩潰,或悄悄寫錯記憶體)。
  • 變數 x 根本沒被更新,後續判斷使用的是垃圾值。

正確寫法

scanf("%f", &x);  // ✅ 正確:傳遞 x 的記憶體位址

記憶體模型圖解

變數 x 在記憶體中佔據 4 bytes (float)
位址: 0x7ffeefbff5a0  (假設)
值:   未初始化 (垃圾值)

scanf("%f", &x)  →  將輸入的數字寫入 0x7ffeefbff5a0
scanf("%f", x)   →  嘗試寫入「垃圾值」當作位址 → 崩潰或靜默錯誤

編譯器警告

現代編譯器 (GCC/Clang/MSVC) 會發出警告:

warning: format '%f' expects argument of type 'float *', but argument 2 has type 'float' [-Wformat=]

務必開啟警告並視為錯誤 (-Wall -Werror 或 VS 專案屬性設定),養成「零警告」習慣。

延伸:其他 scanf 易錯點

錯誤正確說明
scanf("%d", n);scanf("%d", &n);整數同樣需要 &
scanf("%s", str); (char str[20])scanf("%s", str);陣列名稱本身即為位址,**不需** &
scanf("%c", &ch); 吃掉換行符scanf(" %c", &ch);格式字串前加空白跳過空白字元
未檢查回傳值if (scanf("%d", &n) != 1) ...scanf 回傳成功轉換的項目數,可偵測輸入失敗
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved