在 C 語言中,若先宣告 int a[n],之後才給 n 賦值(例如 n = 5),執行時可能出現「程式已停止工作」。將陣列改為 int a[n+1] 則正常,這讓初學者困惑。
C 語言的區域變數陣列若使用變數指定長度(VLA),陣列大小會在宣告那一刻決定。如果 n 尚未賦值,它會是隨機垃圾值,陣列大小可能極大或極小,導致存取越界或堆疊崩潰。
int n = 5; // 先給 n 賦值
int a[n]; // 再宣告陣列
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 泡沫排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
n 有確定值之後才能宣告。n 個元素,不需要 n+1;之前正常可能只是因為剛好沒有觸發越界崩潰,並非正確作法。![]()