可变长度与Malloced ed数组

根据c99标准,我们可以编写以下代码,它是完全合法的

int x; scanf("%d",&x); int ar[x]; 

我的问题是,如果我可以分配这样的数组,为什么我需要malloc再次分配可变大小的数组?

另外,请您解释一下可变长度数组的分配情况如何? 内心深处,是否调用malloc来分配数组或者是什么?

有两个原因让我想到:

  1. 超出此堆栈帧的数组。
  2. 比堆栈大的数组。

可变长度数组分配(或实际上任何数组声明)在堆栈上完成(假设GCC编译器)。 Malloc从堆中分配内存。

堆与堆栈的两个优点:1。堆栈要小得多。 您的可变大小数组很可能会导致堆栈溢出。 2.在返回时声明的函数返回后,在堆栈上分配的项目不会生效。

在C11标准中 ,可变长度数组变为“可选”,我将其称为“实现定义”,因此它们不再是可移植的。

这显示在

6.7.6.2数组声明符第4节

可变长度数组是实现不需要支持的条件特性。

6.10.8.3条件特征宏部分1

__STDC_NO_VLA__整数常量1,用于指示实现不支持可变长度数组或可变修改类型。

使用malloc而不是VLA的一些优点是:

  • malloc的实现通常从堆中获取内存,在大多数C实现中,这是一个比堆栈更大的资源。 但是,C标准中既没有提到也没有堆栈 ,但它们是实现全局和本地内存的常用方法。
  • malloc获得的malloc可以通过realloc增加或减少,但使用VLA是不可能的。
  • malloc获得的malloc可以在程序中传递,直到带有指针的free d,但VLA只能用于函数层次结构中。 VLA在定义它的函数返回后变为死亡,因为它超出了范围。