为什么我们可以在 c 中做到这一点?
int n;
scanf("%d",&n);
int a[n];
我认为数组在加载时位于内存中,但上面的示例似乎在运行时有效。我有什么误解吗?你们能帮忙吗?
谢谢,
C89 中没有可变长度数组,但它是 C99 中的一个新特性。
I thought array is *al*located memory during load time but seems like the above example works during run-time.
是的,像普通数组一样<datatype> <Array_Name> [<size>]
在加载时分配内存,它存在于 C89 中,也存在于 C99 中。
但在代码片段int a[n];
中是一个可变长度数组或简称 VLA。C99 中的 VLA 的定义与任何其他数组一样,只是长度不需要是编译时常量。
可以在这里找到一篇关于 VLA 需求的体面文章:http ://www.ddj.com/cpp/184401444 :)
鉴于您的代码是如何编写的(特别是您有一个语句),这必须是函数中的代码。
虽然我不确定规范中是否严格要求这样做,但在函数中,所有自动(即函数级别,而不是静态)数组都放在堆栈上。因此,无论您有常规数组还是 VL 数组,内存都是在运行时分配的。
非自动数组的内存在运行时不处理,因此不支持 VLA。如果您尝试编译以下代码:
extern int size;
char buff1[size];
void doit(int x)
{
static int buff2[x];
int buff3[x];
}
在我在 (gcc 4.2.1) 上测试过的编译器上,出现以下错误:
moo.c:2: error: variably modified ‘buff1’ at file scope
moo.c: In function ‘doit’:
moo.c:6: error: storage size of ‘buff2’ isn’t constant