C语言中的变长数组
问:C语言中定义数组大小的时候可以使用变量吗?还是只能使用常量或者常量表达式??
1 目前经常使用的C语言有三个版本,分别是 C89、C99 和 C11。C89(也称 ANSI C)是较早的版本,也是最经典的版本,国内大学几乎都是以该版本为基础进行授课。C99 和 C11 是后来对 C89 的升级,增添了一些新内容(不多),语法更加灵活了,同时兼容 C89。
2 各种编译器都能很好地支持 C89 标准,但对 C99 的支持却不同:开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准,而微软的 VC、VS 对 C99 却不感兴趣,直到后来的 VS2013、VS2015、VS2017 才慢慢支持,而且支持得还不好。
3 为什么要讨论这个问题呢?因为 C89 和 C99 对数组做出了不同的规定:
3.1 在 C89 中,必须使用常量表达式指明数组长度;也就是说,数组长度中不能包含变量,不管该变量有没有初始化。
3.2 在 C99 中,可以使用变量指明数组长度。
4 下面的代码使用常量表达式指明数组长度,在任何编译器下都能编译通过:
6 变量的值在编译期间并不能确定,只有等到程序运行后,根据计算结果才能知道它的值到底是什么,所以数组长度中一旦包含了变量,那么数组长度在编译期间就不能确定了,也就不能为数组分配内存了,只有等到程序运行后,得到了变量的值,确定了具体的长度,才能给数组分配内存,我们将这样的数组称为变长数组(VLA, Variable Length Array)。
普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。
9 可变长度数组的限制:
1 必须是自动变量,即:不能使用static、extern关键字修饰
2 必须先声明,再另起一行进行赋值操作,不能使用定义写法(即声明的时候直接初始化)。