堆栈上可变大小的数组

时间:2017-05-08 21:34:31

标签: c++ arrays stack

我的理解是,在C和C ++中,我们创建数据结构,其大小在编译时在堆栈上是已知的,我们使用堆(malloc-free / new-delete)来处理大小未知的事物。编译时间并在运行时决定。为什么我的g ++编译器允许我执行类似下面的代码片段。

int main(void)
{
    int n ;
    cin >> n ; // get the size of array.
    int arr[n] ; // create a variable sized array.
    .... do other stuff ...
}

具体而言,在阵列的情况下:
一个数组在堆栈上被分配了一个连续的内存块,并且堆栈上面和下面都有变量,因此必须知道数组的大小,以便堆栈上的数组上方的变量,即数组本身,并且堆栈中数组下面的变量都可以整齐地适应内存。 如何实现堆栈上可变大小的数组? 为什么它们甚至是必要的?为什么我们不能将堆用于可变大小的缓冲区?

修改
我从评论中了解到,C和C ++对于VLA是否标准有不同的规则,而且Neil Butterworth评论说,一次提出两种语言的问题通常不是一个好主意。 。谢谢大家,所以我从我的问题中删除了C标签,因为我打算主要询问C ++,正如代码片段语法所显示的那样。对不起,感谢您的回答。

1 个答案:

答案 0 :(得分:4)

它们不允许在标准C ++中使用,但它们在标准C中是允许的,而g ++也允许它们在C ++中使用as a language extension

  

如何实现堆栈上可变大小的数组?

this question。要点是大小(n)被评估并存储在编译器生成的局部变量中,然后分配了那么多的堆栈空间。没有物理定律说堆栈变量的大小必须在编译时知道 - 它只是简单的方式。

  

为什么他们甚至需要?

他们不是。在您提供帮助时,您可以使用动态分配执行相同的操作。

  

为什么我们不能将堆用于可变大小的缓冲区?

堆栈分配更有效。