变长数组的需求

大小要运行时才知道?栈上定长不够,int a[n] 又非标准——需要动态内存。

CSP-J

◎学完你会

1判一判:这段定长够用吗

int n; cin >> n; // 运行时才知道要几个 int a[100]; // 定长:写死 100 int b[n]; // ⚠️ 变量当大小:VLA,非标准
场景:用户输入 n=50000,用 a[100] 存
点按钮,看定长数组在“大小未知”时的尴尬。

2关键命令

写法含义问题
int a[100];定长大小写死,装不满/装不下
int a[n];变量当大小(VLA)非标准扩展,别依赖
new int[n];动态申请(见下节)按需分配 ✅
栈上数组大小必须是编译期常量。int a[n] 有些编译器(GCC)当扩展接受,但不是标准 C++,换编译器/判题环境就崩,竞赛不要用。

⚠易错点

VLA 是编译器扩展,非标准:GCC 接受 int a[n],但换 Clang 或其它环境未必。竞赛/判题要写标准 C++,别赌它开扩展。
大数组别放栈上:栈默认只有几 MB。真需要几十万元素的数组,别 int a[1000000] 局部声明(可能栈溢出),要用动态内存(下一节)或全局。

?跨学科:定长像“订好的房间”

酒店房间数写死在楼里(定长)——来的人少了浪费、多了住不下。你要是人数不确定,就得提前按最大备着,或按需“现开房”(动态分配)。

C++ 的“现开房”就是 new:运行时才知道要多大,按需向系统申请。这就是动态内存的意义——大小不提前写死,边跑边决定。

✎练一练

int n; cin>>n; int a[n];(n 是变量)为什么不推荐?
变量当数组大小是VLA(变长数组)扩展,不是标准 C++。换编译器/判题环境可能不支持,所以别依赖,改用 new。
需要按运行时读入的 n 分配数组,标准做法是?
答案:用 int *a = new int[n];(动态申请,见下节)。栈上 int a[n] 是 VLA 扩展,不标准;定长 int a[100] 又无法匹配任意 n。