根据c99标准,我们可以编写以下代码,这是完全合法的
int x;
scanf("%d",&x);
int ar[x];
我的问题是,如果我可以像这样分配一个数组,为什么我需要malloc再次分配可变大小的数组?
另外,您能否解释一下可变长度数组的分配情况如何?内心深处,它是否调用malloc来分配数组或什么?
答案 0 :(得分:12)
我想到了两个原因:
答案 1 :(得分:4)
可变长度数组分配(或实际上任何数组声明)在堆栈上完成(假设是GCC编译器)。 Malloc从堆中分配内存。
堆与堆栈的两个优点: 1.堆栈要小得多。您的可变大小数组很可能会导致堆栈溢出。 2.在返回时声明它们的函数后,在堆栈上分配的项目不会继续存在。
答案 2 :(得分:2)
在C11 standard中,可变长度数组成为“可选”,我指的是“实现定义”,因此它们不再可移植。
这在
中显示6.7.6.2数组声明符第4部分
可变长度数组是实现的条件功能 不需要支持。
和
6.10.8.3条件要素宏第1部分
overflow: auto; height:100px;
整数常量1,用于指示该实现不支持可变长度数组或可变地 修改类型。
与{strong> VLA 相比,使用__STDC_NO_VLA__
的一些优势是:
malloc
的实现通常从
堆,在大多数C实现中,它是比 stack 更大的资源。但是,未提及堆和堆栈
在C标准中,但是它们是实现全局和本地内存的常用方法。malloc
获得的内存可以增加或减少
malloc
,但使用VLA是不可能的。realloc
获得的内存可以在程序周围传递,直到
malloc
d,带有指针,但VLA只能在层次结构中使用
功能。 VLA在其所在的功能之后失效
定义的收益,因为它超出范围。