长久以来,我一直以为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];
这种指向二维数组的指针也一样适用。