C++静态数组,如动态数组

Man*_*ano 2 c++ arrays static

似乎记得C++中的静态数组只能从const表达式初始化,但如果你写:

#include <iostream>

int main() {
  int n;
  std::cin >> n;
  int a[n];
  std::cout << sizeof(a);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序成功编译(gcc C++ 17)并打印n*sizeof(int).但为什么会这样呢?

Ron*_*Ron 5

可变长度数组不是标准的一部分.它们可以作为编译器扩展存在,GCC就是这种情况.编译时,您可能会收到以下警告:

警告:ISO C++禁止变长数组'a'[-Wvla]

应用于数组时,sizeof运算符返回整个数组的大小,该大小是基础类型的大小乘以元素数.参考说明,强调我的:

每个VLA实例的大小在其生命周期内不会改变,但在通过相同代码的另一个传递上,它可以分配 不同的大小.

官方GCC文档标题为6.19可变长度数组:

这些数组的声明与任何其他自动数组一样,但其长度不是常量表达式.存储在声明点分配,并在包含声明的块作用域退出时释放.

这就是说std :: vectorstd :: array更喜欢原始(C风格)数组.