未使用动态分配,编译后设置数组大小的C++代码为何可正常运行?
代码可正常运行的原因
你观察到的现象和你猜测的「编译器提前创建长度为0的数组」无关,本质是编译器对非标准语法的扩展支持:
- 代码里
int array[length]这种用运行时变量定义数组长度的语法叫做变长数组(Variable-Length Array,简称VLA),这是C99标准引入的C语言特性,本身不属于任何版本的C++官方标准。 - 目前GCC、Clang等主流编译器默认开启了对该C特性的C++兼容扩展,编译时会识别该语法:程序运行到数组定义的代码行时,会根据此时
length的用户输入值,直接在栈空间分配对应大小的内存,所以代码可以正常执行。
额外说明
- 该写法不具备跨编译器可移植性:如果开启严格符合C标准的编译参数(例如GCC添加
-pedantic-errors编译选项),这段代码会直接编译失败。C标准要求普通栈数组的长度必须是编译期可确定的常量表达式,不允许用运行时变量定义长度。 - 标准C中如果要实现运行时可变长度的序列,推荐使用标准库容器
std::vector,或者使用new[]/delete[]进行动态内存分配,这两种写法都符合C标准,可跨编译器兼容。
对应示例代码
#include <iostream> using namespace std; int main() { cout << "Enter length of the array: "; int length; cout << length << endl; cin >> length; int array[length] = {}; for(int i = 0; i < length; i++) { array[i] = i; cout << array[i] << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

