可变长度与Malloc-ed数组

时间:2011-07-08 19:22:23

标签: c arrays

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

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

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

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

3 个答案:

答案 0 :(得分:12)

我想到了两个原因:

  1. 超出此堆栈框架的数组。
  2. 大于堆栈的数组。

答案 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在其所在的功能之后失效 定义的收益,因为它超出范围。