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

为何无需动态分配即可创建用户输入大小的数组?

为什么无需new也能创建运行时大小的数组?

你这段代码能正常编译运行,核心原因是GCC和Clang默认支持变长数组(Variable-Length Array, VLA)的编译器扩展——这不是标准C++的特性,但这两个编译器把它作为非标准兼容特性默认开启了。

具体说明:

  • 变长数组是C99标准引入的特性,但C标准(包括C20及之前版本)从未将其纳入规范。GCC、Clang这类编译器为了兼容C代码、简化开发,默认启用了这个扩展。
  • 这类数组直接在栈内存上分配空间,大小由运行时的变量值决定,不需要通过new(new是在堆内存上分配动态内存)。
  • 如果你想强制遵循标准C++规范,可以给编译器添加-pedantic-errors参数,此时这段代码会直接编译报错,明确提示VLA属于非标准扩展特性。

注意风险:

  • 栈内存的总容量通常很小(一般在几MB级别),如果输入的size过大,很容易触发栈溢出,直接导致程序崩溃。
  • 因为这是非标准特性,换用其他编译器(比如MSVC)时,这段代码大概率无法编译通过,代码可移植性极差。

标准C++的替代方案

如果要编写符合标准、安全且可移植的代码,推荐使用std::vector:

#include <string>
#include <iostream>
#include <vector>

int main(){
    int size;
    std::cout << "How many students are in your class: ";
    std::cin >> size;
    std::vector<std::string> students(size); // 标准做法,底层自动管理堆内存

    for(int i=0; i<size; i++){
        std::string place_holder;
        std::cout << "Input a student: ";
        std::cin >> place_holder;
        students[i] = place_holder;
    }
    std::cout << "Your students are ";
    for(int i=0; i<size; i++){
        std::cout << students[i];
        if(i < size-1){
            std::cout << ", ";
        }
    }  
    std::cout << std::endl;

    return 0;
}

内容的提问来源于stack exchange,提问作者Will Leeson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:12:35