可变长度与Malloced ed数组
根据c99标准,我们可以编写以下代码,它是完全合法的
int x; scanf("%d",&x); int ar[x];
我的问题是,如果我可以分配这样的数组,为什么我需要malloc再次分配可变大小的数组?
另外,请您解释一下可变长度数组的分配情况如何? 内心深处,是否调用malloc来分配数组或者是什么?
有两个原因让我想到:
- 超出此堆栈帧的数组。
- 比堆栈大的数组。
可变长度数组分配(或实际上任何数组声明)在堆栈上完成(假设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在定义它的函数返回后变为死亡,因为它超出了范围。