根据c99标准,我们可以编写以下代码,并且完全合法
int x;
scanf("%d",&x);
int ar[x];
我的问题是,如果我可以分配这样一个数组,为什么我需要malloc再分配可变大小的数组?
另外,你能解释一下可变长度数组的分配是如何发生的吗?在内部,它调用malloc来分配数组还是什么?
我想到了两个原因:
- 堆栈帧之外的数组。
- 大于堆栈的数组。
可变长度数组分配(或任何数组声明)是在堆栈上完成的(假设是GCC编译器)。Malloc从堆中分配内存
堆和堆栈的两个优点:1. Stack要小得多。可变大小的数组很有可能导致堆栈溢出。2. 在堆栈上分配的项在返回值中声明的函数之后不存在。
在C11标准中,可变长度数组变成了"可选的",我认为这意味着"实现定义的",因此它们不再是可移植的。
6.7.6.2数组声明符第4节可变长度数组是实现的条件特性不需要支持。
和
6.10.8.3条件特性宏第1节
__STDC_NO_VLA__
整型常量1,表示该实现不支持变长数组或可变长度数组修改类型。
使用malloc
相对于VLA的一些优点是:
-
malloc
的实现通常从堆在大多数C实现中是比堆栈更大的资源。然而,既没有提到堆,也没有提到堆栈但是它们是实现全局和局部内存的常用方法。 从 - 内存可以通过
realloc
,但VLA不可能。 - 从
malloc
获得的内存可以在程序中传递,直到free
d,带指针,但VLA只能在层次结构中使用的功能。VLA在它所处的功能之后就会死亡define返回,因为它超出作用域。
malloc
中获得的