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

C 語言自定義函數調用失效:局部變量未初始化導致邏輯靜默失敗

     編輯:程式設計綜合問答

問題代碼核心片段

int main() {
    int quantity_in, chooise;  // 未初始化!
    int number_in[size];
    char char_in[size];
    
    chooise = get_chooise();  // 返回 1 或 2
    switch(chooise) {
        case 1:
            get_number(quantity_in, number_in[size]);  // quantity_in 為垃圾值
            break;
        case 2:
            get_char(quantity_in, char_in);  // 同理
            break;
    }
}

根因分析

  1. quantity_in 未初始化:自動存儲期局部變量不初始化則值不確定(通常為 0 或棧上殘留值)
  2. 傳遞給函數作為循環上限:for(order=0; order<=quantity-1; order++),若 quantity_in == 0 則循環 0 次,函數體不執行任何讀取操作
  3. 現象表現為「調用不起來」:實際是函數進入了但循環不執行,無任何輸出/交互,極易誤判為函數未被調用

修正方案

int main() {
    int quantity_in = 0;  // 顯式初始化
    int chooise = 0;
    // ...

    chooise = get_chooise();
    switch(chooise) {
        case 1:
            printf("請輸入要讀取的數字個數: ");
            scanf("%d", &quantity_in);  // 從用戶獲取
            get_number(quantity_in, number_in);  // 傳數組名,非 number_in[size]
            break;
        case 2:
            printf("請輸入要讀取的字符個數: ");
            scanf("%d", &quantity_in);
            get_char(quantity_in, char_in);
            break;
    }
}

關鍵修正點

錯誤修正說明
quantity_in 未初始化定義時初始化或 scanf 讀取消除不確定行為
get_number(..., number_in[size])get_number(..., number_in)傳遞數組首地址,[size] 是越界訪問
get_char 循環條件 order<=quantityorder < quantity避免多讀一個字符(含換行符)

編譯器輔助檢查

啟用警告等級:

gcc -Wall -Wextra -Wuninitialized -O1  // GCC/Clang
cl /W4 /Wall                            // MSVC

現代編譯器會直接報警:「variable 'quantity_in' is used uninitialized」,務必把警告當錯誤處理(-Werror)。

調試心法

「遇到『函數沒反應』,先查參數從哪來——未初始化變量是隱形殺手。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved