C++中以变量cols为长度的int (*arr)[cols]为何能正常运行?
为什么不支持VLA的C++能编译运行你提供的代码?
核心原因有两点:
- 你使用的GCC编译器为C++提供了VLA的非官方扩展支持
C官方标准确实从未纳入可变长度数组(VLA)特性,这一特性原本是C99标准新增、C11改为可选的C专属特性。但GCC、Clang这类编译器为了兼容C代码、扩展使用场景,主动给C也实现了VLA的支持,你代码里用变量cols定义数组指针长度int (*arr)[cols]的写法,就是GCC扩展支持的语法。 - 你没有开启严格的C++标准合规检查
你编译时只加了-std=c++11参数,这个参数只会指定使用C11的基础特性,不会禁用GCC自己加的各种扩展功能。如果你编译时加上-pedantic参数开启严格标准检查,GCC就会弹出「ISO C不支持可变长度数组」的警告,加上-pedantic-errors参数的话会直接把这个用法判定为编译错误。
额外提醒:这种依赖编译器扩展的代码没有可移植性,换到不支持VLA扩展的编译器(比如MSVC)上完全无法编译。如果要写符合C标准的动态二维数组,更推荐用
std::vector<std::vector<int>>、一维数组手动计算下标偏移、或者C20的std::span等方案。
内容的提问来源于stack exchange,提问作者rustyhu
相关产品推荐
相关产品推荐

