長久以來,我一直以為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];
這種指向二維陣列的指標也一樣適用。