C语言数组声明疑问:使用变量指定数组大小报错却可正常运行的原因
C语言数组声明疑问:使用变量指定数组大小报错却可正常运行的原因
嗨,我来帮你把这个问题掰扯明白~
首先得先区分你和老师写的两种数组的本质差异:
- 你老师写的是常量长度数组:用
#define SIZE 5定义的是预处理阶段就会替换的常量,属于编译期就能确定值的常量表达式,这是C89(最早的C标准)里唯一合法的数组声明方式,所有编译器都会支持。 - 你写的是可变长度数组(VLA,Variable Length Array):这是C99标准新增的特性,允许用运行时才能确定值的变量(比如你通过
scanf读入的size)来指定数组大小。
那为什么会出现“报错却能运行”的矛盾情况呢?原因出在编译器的标准兼容和扩展特性上:
- 报错的原因:你的IDE或编译器可能默认设置为遵循C89标准(或者某些老编译器比如旧版MSVC本身就不支持C99的VLA),按照旧标准,数组大小必须是常量表达式,所以编译器会给出
"expression must have a constant value"的语法错误提示。 - 能运行的原因:但你的编译器其实偷偷支持VLA作为非标准扩展特性(比如GCC、Clang,或者新版本的MSVC都有这个扩展),即使它在语法检查阶段按旧标准报错,实际编译时还是启用了这个扩展,所以代码能正常编译运行。
另外还要提醒你两个关于VLA的注意点:
- VLA不能像常量数组那样直接用初始化列表(比如
int arr[size] = {1,2,3};是不合法的),因为数组大小在运行时才确定,编译器没法提前处理初始化内容。 - VLA是在栈内存上分配的,如果你输入的
size太大,很容易导致栈溢出,程序崩溃,所以实际开发中如果需要动态大小的数组,更推荐用malloc/free在堆上分配内存。
备注:内容来源于stack exchange,提问作者Phan Quân
相关产品推荐
相关产品推荐

