8

为什么我们可以在 c 中做到这一点?

int n;
scanf("%d",&n);
int a[n];

我认为数组在加载时位于内存中,但上面的示例似乎在运行时有效。我有什么误解吗?你们能帮忙吗?

谢谢,

4

4 回答 4

9

我不是 C 方面的专家,但这可能是由C99添加并由GCC 支持的可变长度数组。GCC 在堆栈上为此类数组分配内存,以便在您从函数返回时自动释放。

于 2009-12-08T05:44:29.013 回答
7

C89 中没有可变长度数组,但它是 C99 中的一个新特性。

于 2009-12-08T05:44:34.007 回答
6

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 :)

于 2009-12-08T08:57:25.893 回答
0

鉴于您的代码是如何编写的(特别是您有一个语句),这必须是函数中的代码。

虽然我不确定规范中是否严格要求这样做,但在函数中,所有自动(即函数级别,而不是静态)数组都放在堆栈上。因此,无论您有常规数组还是 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
于 2009-12-08T07:25:19.537 回答