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

以变量作为数组大小的C程序为何能运行?数组大小需为常量吗?

为什么用变量当数组大小的C程序能正常运行?

你之前了解的「数组大小必须是常量」是老版本C语言(C89标准)的要求,但从C99标准开始,C语言新增了**变长数组(Variable-Length Array, VLA)**的特性,专门解决这种需要动态指定数组大小的场景。

变长数组的关键细节

  • 它的大小是在程序运行时确定的,不是编译时,所以可以像你代码里那样,用用户输入的变量来定义数组长度,只要变量在声明数组时已经有确定的值就行。
  • 变长数组只能是函数内部的局部数组,内存从栈上分配,所以如果输入的s太大,容易触发栈溢出导致程序崩溃,这是要注意的风险。
  • 老版本仅支持C89的编译器会报错,但现在主流的GCC、Clang,还有开启C99支持的MSVC,都能正常编译这种代码。

你的代码能运行的原因

看你这段代码:

#include<stdio.h>
int main(){
    int s;
    scanf("%d",&s);//taking s as user input
    int arr[s];//s not a constant
    for(int i=0;i<s;i++){
        scanf("%d",&arr[i]);
    }
    printf("\nyou entered the array: \n");
    for(int i=0;i<s;i++){
        printf("%d ",arr[i]);
    }
    return 0;
}

声明arr的时候,s已经通过scanf拿到了用户输入的具体数值,完全符合C99对变长数组的要求,所以编译器能正常处理,程序也就跑起来了。

额外建议

如果担心栈溢出问题,或者需要更灵活的内存管理,也可以用malloc和free在堆上分配动态内存——堆的空间比栈大很多,还能手动控制内存的释放时机。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:40:32