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

C 語言陣列宣告順序與泡沫排序:為什麼 int a[n] 會導致程式當機?

     編輯:程式設計綜合問答

問題現象

在 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;之前正常可能只是因為剛好沒有觸發越界崩潰,並非正確作法。

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