运行时输入n为何可创建变长数组input2?动态数组疑问解析
关于运行时创建数组的疑问
运行时输入n后,为什么能创建包含n个元素的数组?我理解
int *input = new int[n]这种动态数组写法可正常运行,但为何int input2[n]这种写法没有报错?我尝试了如下代码,运行完全正常:
int main(){ int n; cin >> n; int *input = new int[n]; for(int i=0;i<n;i++) input[i] = i; for(int i=0;i<n;i++) cout<<input[i]<<" "; cout<<endl; int input2[n]; cout<<n<<endl; for(int i=0;i<n;i++) input2[i] = i; for(int i=0;i<n;i++) cout<<input2[i]<<" "; }
原因解析
new int[n]是标准C++支持的动态内存分配:这种写法在堆(heap)上申请能容纳n个int的内存,返回指向该内存的指针,属于标准C++的核心特性,所有合规编译器都必须支持。注意使用后要手动调用delete[] input释放内存,避免内存泄漏。int input2[n]是编译器扩展的变长数组(VLA):标准C++(直到C++20)并不支持这种“运行时确定大小的栈数组”,但GCC、Clang等主流编译器把它作为非标准扩展特性实现了,所以你的代码能正常编译运行。不过这种写法存在明显缺陷:- 可移植性差:换成严格遵循标准的编译器(比如默认模式下的MSVC),代码会直接编译报错。
- 栈溢出风险:栈的空间通常只有几MB,若输入的n过大,会直接触发栈溢出导致程序崩溃,而堆的可用空间远大于栈。
标准C++的替代方案
如果需要运行时确定大小的数组,推荐使用标准库的std::vector,它既符合标准,又安全易用,还能自动管理内存:
#include <vector> int main(){ int n; cin >> n; std::vector<int> input(n); for(int i=0;i<n;i++) input[i] = i; for(int i=0;i<n;i++) cout<<input[i]<<" "; cout<<endl; std::vector<int> input2(n); cout<<n<<endl; for(int i=0;i<n;i++) input2[i] = i; for(int i=0;i<n;i++) cout<<input2[i]<<" "; }
内容的提问来源于stack exchange,提问作者sakshi singhal
相关产品推荐
相关产品推荐

