变成数组:
变长数组(Variable Length Array,VLA)是一种用于存储不定长度数据的数组类型,其大小可以在运行时动态确定。C99 标准引入了这一特性,允许用户通过变量来指定数组大小,从而极大方便了程序设计。
例如,下面是一个可以用 C 语言实现的变长数组例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("请输入数组大小:");
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
printf("生成的数组为:\n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
值得注意的是,在某些编译器中,开启了 gcc 或 clang 的 -pedantic-errors
严格模式可能会造成如下错误的编译:
error: variable length array declaration not allowed at file scope
这个问题源于 C99 中所支持的变长数组并不允许在全局作用域下声明。此时,使用动态内存分配或者 malloc 函数来构建动态数组是一种较好的解决方案。
静态数组:
静态数组是一种在编译时就已经确定了大小的数组,其内存空间在程序运行前就已分配好,并在整个程序运行期间都存在。与之相对,动态数组则可以在程序运行过程中动态分配内存大小。
const size_t N = 32;
char buff[N];
这里的 char buff[N]
是一个固定大小的静态数组,它在编译时就被分配好了内存空间,并不属于变长数组。
C++ 标准确实不支持变长数组,也就是不能定义数组的长度为运行时确定的变量。但是固定大小的静态数组是合法的,而且在 C++ 中广泛使用。
需要注意的是,如果在栈上声明一个过大的静态数组(如 char buff[1024 * 1024 *1024]
),有可能会导致栈溢出的错误。所以一般来说,在声明数组之前应该对其大小进行合理的估算和限制。