变长数组(VLA)
之前处理二维数组的函数中可能不太理解,为何只把数组的行数作为函数的形参,而列数却内置在函数体内,如下:

假设声明了下列数组:
int ar1[5][4];
int ar2[100][4];
int ar3[2][4];
可以用sum2d()函数分别计算这些数组的元素之和,之所以能,是因为这些数组的列数固定为4,而行数被传递给形参rows,它是一个变量。如果我们变更列数的话:6行5列的数组,就不能使用这个函数了,需要重建一个COLS为5的函数。因为C规定,数组的维数必须是常量,不能用变量代替COLS。
鉴于此,C新增了变长数组(Variable-length array, VLA),运行使用变量便是数组的维度,如下:
int quarters = 4;
int regions = 5;
double sales[ quarters ][ regions ]; //一个变长数组
注意变长数组有一些限制,它必须是自动存储类别,不能是static或extern存储类别,而且不能在声明中初始化他们。
变长数组不是改变大小,创建之后大小依旧是固定的;“变长”指的是在创建时可以指定数组的维度
使用VLA来修改一个sum2d()函数:


需要注意的是,在函数定义的形参中声明的变长数组并未时间创建数组。和传统的语法类似,变长数组名实际上是一个指针。这说明带变长数组形参的函数实际上是在原始数组中处理数据,因此可以修改传入的数组。
const和数组大小
C90标准不允许变长数组使用const变量;
C99/C11运行使用。
变长数组还允许动态内存分配,可以在程序运行时指定数组的大小。普通C数组都是静态内存分配,即在编译时确定数组大小。

浙公网安备 33010602011771号