例如,我有一个基于用户输入的动态大小的数组:
int n;
cin >> n;
int items[n];
这个数组是在堆栈上分配的吗?还是像我写的那样在堆上:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
编辑:我了解第二个代码的作用。我在问第一个代码是否与第二个代码做同样的事情,但行数更少。
例如,我有一个基于用户输入的动态大小的数组:
int n;
cin >> n;
int items[n];
这个数组是在堆栈上分配的吗?还是像我写的那样在堆上:
int n, *items;
cin >> n;
items = new int[n];
...
delete [] items;
编辑:我了解第二个代码的作用。我在问第一个代码是否与第二个代码做同样的事情,但行数更少。
您的第一个示例根本没有使用动态数组 - 它使用的是堆栈分配的可变长度数组(通常在幕后相当于一个alloca
调用,sizeof
运算符除外),这是 C99 的一个特性,而不是C++。
当然,您的第二个数组是通过 new 在堆上分配的。
您new
用于分配内存,因此您的数组存储在堆中
您的第一个代码块将无法编译,如果不使用 new 或 malloc/calloc/realloc 的内存分配,您将无法分配动态大小的数组。
为了做你想做的事,你需要做你在第二个块中拥有的东西,它总是在堆上分配。
动态 = 堆。非动态 = 堆栈。
永远记得释放你的记忆!