原來C語言的陣列大小可以是一個變數呀!

長久以來,我一直以為C語言的陣列大小必須是在編譯前就確定下來的常量值,相信很多C語言初學者也是和我一樣的認識。然而,直到今天我才發現原來從C99標準開始C語言就已經支援了可變長陣列

例如如下程式(注:VS系列編譯器均不支援該特性,搞不懂微軟為何不好好支援C99標準):

#include <stdio.h>
int main(void) {
    int a = 2;
    int b[a + 1];   // 陣列b的長度只有在執行時才可以確定。
    for (int i = 0; i < 3; i++) {
        b[i] = i;
        printf("%d\n", b[i]);
    }
    return 0;
}

上面的程式碼在GCC 7.3上測試透過(實際上任何支援C99標準的編譯器都可以)。
需要注意的是,在C語言中,可變長陣列只能用於區域性變數中,在全域性變數中使用可變長陣列會導致編譯器報錯。
另外,可變長陣列不等於動態陣列,也就是說,陣列的維度在變數的整個生命週期中是不可變的。
可變長陣列對於二維、三維…的陣列及類似int (*a)[b/*b是個變數*/ + 2];這種指向二維陣列的指標也一樣適用。