Where are dynamic size arrays created on? (stack or heap)
例如,我有一个基于用户输入的动态大小数组:
1 2 3
| int n;
cin >> n;
int items[n]; |
这个数组是在堆栈上分配的吗?还是像我写的:
1 2 3 4 5
| int n, *items;
cin >> n;
items = new int[n];
...
delete [] items; |
编辑:我理解第二个代码的作用。我在问第一个代码是否和第二个代码做的一样,但是行数更少。
- 相关:stackoverflow.com/a/1169916/1141471
您的第一个示例根本不使用动态数组——它使用的是堆栈分配的可变长度数组(通常在幕后相当于EDCOX1调用1调用),除了EDCOX1(2)操作符之外,这是C99,而不是C++的一个特性。
当然,第二个数组是通过new在堆上分配的。
- 注意,在标准C++中不支持可变长度数组,因此第一个代码片段将是C99(没有EDCOX1,0个s)和C++(没有VLAs)的语法错误。然而,一些编译器支持C++中的VLAs作为扩展。
- Insilico纠正,但许多C++编译器支持C99特性作为扩展(至少GCC,Clang,也许MSVC确实如此)。
- @我会毫无预警地编译。用G++测试,没有任何构建参数。
- 它的工作是因为可变长度数组(这是第一个代码片段需要的)被gcc作为扩展支持。它在标准C++中不被支持。
- @是的,我现在都读过了。但是为什么它在没有任何警告的情况下编译呢?
- @MIRO:使用扩展时,不需要编译器发出警告。在这种情况下,gcc的编译器编写器选择不让它发出警告(尽管在编译时可能会启用所有警告)。
- @阴险的说,是正确的答案,我的朋友。
使用new分配内存,因此数组存储在堆中。
- 我在问动态大小数组背后是什么,而不是第二个代码是什么:)
- 是的,在这种情况下,堆是动态大小数组的后备存储。你还想知道什么?
- 如果创建的数组没有"new"或动态内存分配函数,并且大小不变,那么它将存储在堆栈中。如果为数组分配内存(而且大小也可能是一个非常量表达式),那么它就在堆中。
您的第一个代码块将无法编译,如果不使用新的或malloc/calloc/realloc的内存分配,则无法分配动态大小的数组。
为了做你想做的事情,你需要做你在第二个块中拥有的事情,而第二个块将总是在堆上分配。
动态=堆。非动态=叠加。
永远记住释放你的记忆!
- 真的????ideone.com/s67g18
- @MIRO:它工作是因为gcc支持可变长度数组(这是第一个代码片段需要的)作为扩展。它在标准C++中不被支持。
- 请理解,问题第一部分中显示的VLA是一个C99扩展,大多数现代编译器都支持它。