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

时间:2017-12-25 12:30:33

标签: c++ arrays static

似乎记得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)。 但为什么会这样呢?

1 个答案:

答案 0 :(得分:5)

Variable-length arrays不是标准的一部分。它们可以作为编译器扩展存在,GCC就是这种情况。编译时,您可能会收到以下警告:

  

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

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

  

每个VLA实例的大小在其生命周期内不会改变,但是   在另一次通过相同的代码时,可能分配一个   不同尺寸

GCC官方文件标题为6.19 Arrays of Variable Length州:

  

这些数组的声明与任何其他自动数组一样,但有一个   长度不是常数表达式。存储分配在   块范围时声明和解除分配的点   包含声明出口。

据说更喜欢std::vectorstd::array到原始(C风格)数组。