可变长度与Malloc-ed数组

Fin*_*fin 8 c arrays

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

int x;
scanf("%d",&x);
int ar[x];
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*nan 12

我想到了两个原因:

  1. 超出此堆栈帧的数组.
  2. 比堆栈大的数组.

  • @hexa这就是第1项 (3认同)

ssh*_*nin 5

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

堆与堆栈相比有两个优点: 1. 堆栈要小得多。您的可变大小数组很有可能导致堆栈溢出。2. 在堆栈上分配的项目在声明它们的函数返回后不会继续存在。