【发布时间】:2017-12-25 12:30:32
【问题描述】:
似乎记得C++中的静态数组只能从const表达式初始化,但如果你写:
#include <iostream>
int main() {
int n;
std::cin >> n;
int a[n];
std::cout << sizeof(a);
return 0;
}
此程序成功编译 (gcc C++17) 并打印 n * sizeof(int)。 但是为什么会这样呢?
【问题讨论】:
-
为什么不使用
std::vector? -
Gcc(不幸的是)默认情况下允许 VLA 作为扩展。使用
-std=c++17和/或-Wvla -Werror编译,它不会。 -
但是 VLA 是如何工作的呢?有没有预留栈?
-
使用-pedantic编译。
-
编译器可以解决问题。例如,它将在堆中分配内存空间,并在每个退出点将其删除(例如函数中的所有返回语句)。