似乎被记住,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样式)阵列。