以变量作为数组大小的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
相关产品推荐
相关产品推荐

