2013-03-16 86 views
1

例如,我有动态大小的阵列基于用户输入:在哪里创建动态大小数组? (堆栈或堆)

int n; 
cin >> n; 
int items[n]; 

这是阵列上堆分配?或者是它堆一样,如果我写:

int n, *items; 
cin >> n; 
items = new int[n]; 
... 
delete [] items; 

编辑:据我所知,第二个代码做什么。我问第一个代码是否像第二个代码一样执行相同的操作,但使用的行数较少。

+0

相关:http://stackoverflow.com/a/1169916/1141471 – sehe 2013-03-16 19:46:08

回答

5

你的第一个例子中没有使用动态数组在所有 - 它使用一个堆栈分配的变长数组(通常幕后相当于一个alloca调用,除了sizeof运算符),这是C99的一个功能,而不是C++。

你的第二个数组当然是通过new分配在堆上的。

+6

请注意,标准C++不支持变长数组,因此第一个代码片段在C99(无'iostream's)和C++(无VLA)中都将是语法错误。不过,有些编译器支持C++中的VLA作为扩展。 – 2013-03-16 19:29:32

+0

@Insilico是正确的,但许多C++编译器支持C99功能作为扩展(至少GCC,Clang,也许MSVC)。 – 2013-03-16 19:30:15

+1

@Insilico我会在没有警告的情况下编译。用g ++进行测试,没有任何构建参数。 – kravemir 2013-03-16 19:32:47

1

您使用new分配内存,让您的数组存储在堆

+0

我问动态大小的数组背后是什么,而不是第二个代码是什么:) – kravemir 2013-03-16 19:27:30

+2

是的,堆是什么作为后盾在这种情况下存储动态大小的数组。你还想知道什么? – 2013-03-16 19:28:38

+0

如果您创建一个不带“新”或动态内存分配函数的数组,并且大小不变,那么它将存储在堆栈中。如果你为你的数组分配一个内存(并且size也可能是一个非const表达式),那么它就在堆中。 – nabroyan 2013-03-16 19:34:47

-1

您的第一个代码块将无法编译,您无法使用new或malloc/calloc/realloc分配一个动态大小的数组。

为了做你想做的事情,你需要做第二块中的东西,它总是分配在堆上。

Dynamic =堆。非动态=堆栈。

永远记得释放你的记忆!

+2

真的吗? http://ideone.com/S67G18 – kravemir 2013-03-16 19:28:20

+1

@Miro:它的工作原理是[可变长度数组](http://en.wikipedia.org/wiki/Variable-length_array)(这是第一个代码片段要求的)是[由GCC作为扩展支持](http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html)。它在标准C++中不受支持。 – 2013-03-16 19:32:14

+1

请理解,问题的第一部分中显示的VLA是C99扩展,并且得到大多数现代编译器的支持。 – 2013-03-16 19:32:20