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;
}
}
for(order=0; order<=quantity-1; order++),若 quantity_in == 0 則循環 0 次,函數體不執行任何讀取操作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<=quantity | order < quantity | 避免多讀一個字符(含換行符) |
啟用警告等級:
gcc -Wall -Wextra -Wuninitialized -O1 // GCC/Clang
cl /W4 /Wall // MSVC
現代編譯器會直接報警:「variable 'quantity_in' is used uninitialized」,務必把警告當錯誤處理(-Werror)。
「遇到『函數沒反應』,先查參數從哪來——未初始化變量是隱形殺手。」