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

C++中T temp[b]与new T[b]的区别及编译报错咨询

两种数组声明方式的差异与原理解析

一、T temp[b]:变长数组(VLA)

  • 这是C99标准引入的**变长数组(Variable-Length Array, VLA)**特性,C标准(从C11到C++20)并未将其纳入规范,仅部分编译器(如GCC、Clang)通过扩展特性支持。
  • 它在栈内存上分配空间,栈的总大小有限(通常为几MB),且C要求静态数组的大小必须是编译期常量——编译器在编译阶段无法确定变量b的值,因此VS2019 16.8.2这类严格遵循C标准的编译器会抛出C2131(表达式未计算为常量)、C3863(数组类型不可赋值)等错误。
  • 在线编译器(如GCC)因支持GNU扩展,所以能正常编译,但这种写法移植性极差,换用不支持扩展的编译器就会报错。

二、T* temp = new T[b]:动态内存分配

  • 这是C++标准明确支持的动态内存分配方式,通过new运算符在堆内存上申请空间。堆内存的大小远大于栈,且内存分配操作是在程序运行期执行的——此时变量b的值已经确定,完全可以用它指定要分配的元素数量。
  • 这种写法兼容性极强,所有符合C++标准的编译器都能正常处理,但需要注意:动态分配的内存不会自动释放,必须在使用完后调用delete[] temp手动释放,否则会造成内存泄漏。

核心差异总结

维度T temp[b](VLA)T* temp = new T[b](动态分配)
内存区域栈内存堆内存
C++标准兼容性非标准扩展,仅部分编译器支持标准特性,全兼容
内存管理作用域结束时自动销毁需手动调用delete[]释放
大小限制受栈空间限制,无法分配过大数组受系统可用内存限制,大小更灵活

内容的提问来源于stack exchange,提问作者성동현

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:02:15