C 静态数组,例如动态阵列



似乎被记住,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)。但是为什么这样?

可变长度阵列不是标准的一部分。它们可以作为编译器扩展,而GCC就是这种情况。编译时,您可能会收到警告:

警告:ISO C 禁止变量长度阵列'a'[-wvla]

应用于数组时,大小运算符会返回整个数组的大小,即基础类型的大小,元素数量是元素的数量。参考状态,重点是我的:

每个VLA实例的大小在其一生中不会更改,但是 在另一个通过相同代码的通过, May 被分配给 不同的大小

标题为6.19可变长度状态的官方GCC文档:

这些数组像其他任何自动阵列一样声明,但有一个 长度不是恒定表达式。存储分配在 当块范围时,声明的点和划分 包含声明退出。

说,更喜欢std :: vector或std :: array到RAW(C样式)阵列。

最新更新