原来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];这种指向二维数组的指针也一样适用。