You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时输入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:15:35