C++运行时确定大小的静态分配数组可正常运行问题咨询
问题现象解释
你观察到的这个特性叫做变长数组(Variable-Length Array, VLA),核心原因如下:
- 变长数组是C99标准中新增的C语言特性,从来没有被纳入任何版本的C++官方标准,按照纯C++规范的要求,你的代码确实是不符合语法要求的。
- 你所使用的编译器(大概率是GCC、Clang这类类Unix平台常用编译器)默认开启了非标准扩展支持,专门兼容了C语言的VLA特性,所以你的代码才能正常编译运行。
- 如果开启严格符合C标准的编译选项,这段代码会直接报错。例如使用GCC时添加编译参数
g++ -std=c++17 -pedantic-errors test.cpp,编译器会直接抛出错误提示「ISO C forbids variable length array ‘array’」。
使用注意事项
我们非常不建议在C++代码中使用该特性,原因如下:
- 可移植性极差:微软的MSVC编译器完全不支持VLA扩展,这类代码放到Visual Studio中会直接编译失败,无法跨平台使用。
- 安全性低:VLA分配在栈空间上,而默认栈空间通常只有几MB,一旦运行时输入的数值过大,会直接触发栈溢出导致程序崩溃,没有任何安全兜底机制。
- 不符合C设计规范:C标准库已经提供了
std::vector容器,完全可以实现运行时确定长度的序列存储,同时支持越界检查、自动内存管理、迭代器等特性,远比VLA安全易用。
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

