为什么在运行期间c中接受?

为什么我们可以在c中这样做?

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

我认为数组在加载时间内位于内存中,但似乎上述示例在运行时期间有效。 我是否误解了任何事情? 你们能帮忙吗?

谢谢,

I thought array is *al*located memory during load time but seems like the above example works during run-time.

是的,像 []这样的普通数组在C89中存在的加载时间内分配内存,也存在于C99中。

但是在代码片段中, int a[n]; 是一个可变长度数组或简称VLA。在C99中的VLA定义与任何其他数组一样,只是长度不需要是编译时常量。

有关需要VLA的文章可以在这里找到: http ://www.ddj.com/cpp/184401444 🙂

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

在C89中找不到可变长度数组 ,但它是C99中的新function。

鉴于您的代码是如何编写的(具体而言,您有一个语句),这必须是函数内的代码。

虽然我不确定规范中是否严格要求,但在函数内,所有自动(即function级别,非静态)数组都放在堆栈中。 因此,无论您是常规还是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