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

未使用动态分配,编译后设置数组大小的C++代码为何可正常运行?

代码可正常运行的原因

你观察到的现象和你猜测的「编译器提前创建长度为0的数组」无关,本质是编译器对非标准语法的扩展支持:

  • 代码里int array[length]这种用运行时变量定义数组长度的语法叫做变长数组(Variable-Length Array,简称VLA),这是C99标准引入的C语言特性,本身不属于任何版本的C++官方标准。
  • 目前GCC、Clang等主流编译器默认开启了对该C特性的C++兼容扩展,编译时会识别该语法:程序运行到数组定义的代码行时,会根据此时length的用户输入值,直接在栈空间分配对应大小的内存,所以代码可以正常执行。
额外说明
  • 该写法不具备跨编译器可移植性:如果开启严格符合C标准的编译参数(例如GCC添加-pedantic-errors编译选项),这段代码会直接编译失败。C标准要求普通栈数组的长度必须是编译期可确定的常量表达式,不允许用运行时变量定义长度。
  • 标准C中如果要实现运行时可变长度的序列,推荐使用标准库容器std::vector,或者使用new[]/delete[]进行动态内存分配,这两种写法都符合C标准,可跨编译器兼容。

对应示例代码

#include <iostream>
using namespace std;

int main()
{
    cout << "Enter length of the array: ";
    int length;
    cout << length << endl;
    cin >> length;
    int array[length] = {};
    for(int i = 0; i < length; i++)
    {
        array[i] = i;
        cout << array[i] << endl;
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:06:03