原始錯誤代碼
int stu[10][4];
for (i = 1; i <= 10; i++) {
for (j = 1; j <= 4; j++) {
cin >> stu[10][4]; // 錯誤:固定寫入 stu[10][4] 越界
}
}
for (i = 1; i <= 10; i++) {
for (j = 1; j <= 4; j++) {
cout << stu[i][j] << endl; // 索引 1~10 越界,合法 0~9
}
}
三大錯誤
- 陣列索引從 0 開始:
stu[10][4] 合法索引為 0~9、0~3。
- 輸入語句寫死索引:應為
cin >> stu[i][j]。
- 輸出格式:每行 4 科成績應同行顯示,而非每科換行。
修正後標準寫法
#include <iostream>
using namespace std;
int main() {
const int STUDENTS = 10;
const int SUBJECTS = 4;
int stu[STUDENTS][SUBJECTS];
for (int i = 0; i < STUDENTS; i++) {
cout << "請輸入第 " << i+1 << " 位學生的四門成績: ";
for (int j = 0; j < SUBJECTS; j++) {
cin >> stu[i][j];
}
}
cout << "\n所有學生成績:\n";
for (int i = 0; i < STUDENTS; i++) {
for (int j = 0; j < SUBJECTS; j++) {
cout << stu[i][j] << " ";
}
cout << endl;
}
return 0;
}
進階:動態分配與 vector
vector<vector<int>> stu(STUDENTS, vector<int>(SUBJECTS));
// 使用方式相同,自動管理記憶體,支援擴容
除錯技巧
- 編譯加
-Wall -Wextra -fsanitize=address(GCC/Clang)啟用位址消毒器捕獲越界。
- Visual Studio 開啟
/RTC1 執行期檢查。
- 善用
assert(i >= 0 && i < STUDENTS) 防禦性編程。
