C 语言中的可变长度数组
C 语言中的可变长度数组也称为可变大小数组或运行时大小数组。它的长度在运行时确定,而不是在程序编译时确定。其大小取决于程序运行时生成的值,通常作为用户输入接收。
通常,数组大小在程序中预先声明,如下所示:
int arr[10];
数组的大小一旦声明,在程序执行期间保持不变,并且无法在运行时更改。但是,对于可变长度数组 (VLA),编译器会在堆栈上分配具有自动存储期限的内存。 C99 标准中添加了对 VLA 的支持。
创建可变长度数组
创建可变长度数组的语法如下 -
void arr_init(int length){ int arr[length]; //code using arr; };
示例
以下示例演示了如何创建可变长度数组 -
#include <stdio.h> int main(){ int i, j; int size; // 用于保存一维数组大小的变量 printf("Enter the size of one-dimensional array: "); scanf("%d", &size); int arr[size]; for(i = 0; i < size; ++i){ printf("Enter a number: "); scanf("%d", &j); arr[i] = j; } for(i = 0; i < size; ++i) printf("a[%d]: %d ", i, arr[i]); return 0; }
输出
运行此代码时,它会要求您输入数组的大小。请注意,数组的长度在声明时并非固定不变。您需要在运行时定义其大小。
Enter the size of one-dimensional array: 5 Enter a number: 1 Enter a number: 5 Enter a number: 7 Enter a number: 8 Enter a number: 7 a[0]: 1 a[1]: 5 a[2]: 7 a[3]: 8 a[4]: 7
二维可变长度数组
我们也可以声明并使用二维可变长度数组。
示例 1
请看以下示例 -
#include <stdio.h> int main(){ int i, j, x; int row, col; // number of rows & columns of two D array printf("Enter number of rows & columns of 2-D array: "); scanf("%d %d", &row, &col); int arr2D[row][col]; for(i = 0; i < row; ++i){ for(j = 0; j < col; ++j){ printf("Enter a number: "); scanf("%d", &x); arr2D[i][j] = x; } } for(i = 0; i < row; ++i){ printf(" "); for(j = 0; j < col; ++j) printf("%d ", arr2D[i][j]); } return 0; }
输出
运行代码并检查其输出 −
Enter number of rows & columns of 2-D array: 2 3 Enter a number: 10 Enter a number: 20 Enter a number: 30 Enter a number: 40 Enter a number: 50 Enter a number: 60 10 20 30 40 50 60
示例 2
以下代码声明了一个可变长度的一维数组,并用递增的数字填充它 -
#include <stdio.h> int main(){ int n; printf("Enter the size of the array: "); scanf("%d", &n); int arr[n]; for(int i = 0; i < n; i++) arr[i] = i+1; printf("The array elements are: "); for(int i = 0; i < n; i++) printf("%d ", arr[i]); return 0; }
输出
运行代码并检查其输出 −
Enter the size of the array: 5 The array elements are: 1 2 3 4 5 ....
示例 3
以下代码使用 stdlib.h 头文件中的函数 srand() 和 rand(),将随机生成的数字填充到可变长度数组中。
#include <stdio.h> #include <stdlib.h> #include <time.h> void oneDArray(int length, int a[length]); // 函数原型 void twoDArray(int row, int col, int a[row][col]); // 函数原型 int main(){ int i, j; // 计数器变量 int size; // 保存一维数组大小的变量 int row, col; // 二维数组的行数和列数 srand(time(NULL)); printf("Enter the size of one-dimensional array: "); scanf("%d", &size); printf("Enter the number of rows & columns of 2-D array: "); scanf("%d %d", &row, &col); // 声明数组 int arr[size]; // 二维数组 int arr2D[row][col]; // 一维数组 for(i = 0; i < size; ++i){ arr[i] = rand() % 100 + 1; } // 二维数组 for(i = 0; i < row; ++i){ for(j = 0; j < col; ++j){ arr2D[i][j] = rand() % 100 + 1; } } // 打印数组 printf("One-dimensional array: "); // oneDArray(size, arr); for(i = 0; i < size; ++i) printf("a[%d]: %d ", i, arr[i]); printf(" Two-dimensional array: "); // twoDArray(row1, col1, arr2D); for(i = 0; i < row; ++i){ printf(" "); for (j = 0; j < col; ++j) printf("%5d", arr2D[i][j]); } }
输出
运行代码并检查其输出 −
Enter the size of one-dimensional array: 5 Enter the number of rows & columns of 2-D array: 4 4 One-dimensional array: a[0]: 95 a[1]: 93 a[2]: 4 a[3]: 52 a[4]: 68 Two-dimensional array: 92 19 79 23 56 21 44 98 8 22 89 54 93 1 63 38
交错数组
交错数组是两个或多个数据类型相似、长度可变的数组的集合。在 C 语言中,交错数组的概念是通过数组指针来实现的。
交错数组如下图所示 -

示例
在此程序中,我们声明三个大小不同的一维数组,并将它们的指针存储在一个指针数组中,该数组充当交错数组。
#include <stdio.h> int main(){ int a[] = {1,2}; int b[] = {3,4,5}; int c[] = {6,7,8,9}; int l1 = sizeof(a)/sizeof(int), l2 = sizeof(b)/sizeof(int), l3 = sizeof(c)/sizeof(int); int *arr[] = {a,b,c}; int size[] = {l1, l2, l3}; int *ptr; int i, j, k = 0; for(i = 0; i < 3; i++){ ptr = arr[i]; for(j = 0; j < size[k]; j++){ printf("%d ", *ptr); ptr++; } printf(" "); k++; arr[i]++; } return 0; }
输出
运行此代码时,将产生以下输出 -
1 2 3 4 5 6 7 8 9
与堆分配相比,VLA 是一种更快速、更直接的选项。大多数现代 C 编译器(例如 GCC、Clang 等)都支持 VLA,并且大多数编译器都使用 VLA。