c-可变长度数组vs Malloc-ed数组

  • 本文关键字:数组 vs Malloc-ed arrays
  • 更新时间 :
  • 英文 :


根据c99标准,我们可以编写以下代码,并且完全合法

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

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

另外,你能解释一下可变长度数组的分配是如何发生的吗?在内部,它调用malloc来分配数组还是什么?

我想到了两个原因:

  1. 堆栈帧之外的数组。
  2. 大于堆栈的数组。

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

堆和堆栈的两个优点:1. Stack要小得多。可变大小的数组很有可能导致堆栈溢出。2. 在堆栈上分配的项在返回值中声明的函数之后不存在。

在C11标准中,可变长度数组变成了"可选的",我认为这意味着"实现定义的",因此它们不再是可移植的。

6.7.6.2数组声明符第4节

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

6.10.8.3条件特性宏第1节

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

使用malloc相对于VLA的一些优点是:

  • malloc的实现通常从在大多数C实现中是比堆栈更大的资源。然而,既没有提到,也没有提到堆栈但是它们是实现全局和局部内存的常用方法。
  • malloc中获得的
  • 内存可以通过realloc,但VLA不可能。
  • malloc获得的内存可以在程序中传递,直到 freed,带指针,但VLA只能在层次结构中使用的功能。VLA在它所处的功能之后就会死亡define返回,因为它超出作用域。

最新更新