#include <iostream>
using namespace std;
void aa(int n) {
int test[n] = {0};
}
int main() {
aa(10);
return 0;
}
并且得到
error: variable-sized object may not be initialized
但是
#include <iostream>
using namespace std;
void aa(int n) {
int test[n];
fill(test,test+10,0);
}
int main() {
aa(10);
return 0;
}
没关系
我想知道在前一个失败的情况下编译该文件的原因。
VLA不属于C ++。一些编译器支持它们作为扩展。它们来自C99,在C99中you cannot initialize VLA中带有= {0};
。一些编译器(例如GCC)走得更远,并增加了对此类初始化的支持。在GCC中,可以从version 4.9开始使用此语法。 Clang显然不支持它,也不必这样做。
您只能声明一个大小恒定的数组,该大小可以在编译时推导。变量n
仅在运行时才能知道。
详细地说,当您在堆栈上分配内存时,必须在编译时知道大小。由于数组是方法的局部数组,因此将它们放置在堆栈中。
对我来说都很好,我想这与您的编译器版本有关
您的两个示例都不合法,因为n
不是编译时间常数,并且标准C ++不允许非常量长度用于数组初始化(但是C允许。)>
第二个示例进行编译的原因是,您解决了第一个示例中编译器似乎唯一的问题,即未初始化。
[I recommend compiling with all compiler warnings enabled, which probably should be default anyway.您可以在GCC中启用它们,例如,使用-Wall -Wextra
以及-Werror
。
您可能想改用std::vector和resize。如果是这样,您的代码将变为
#include <vector>
void aa(int n) {
// 1st parameter: number of elements, 2nd: value of elements.
std::vector<int> test(n, 0);
// test.resize(n, 0); // is also possible
// std::fill(test.begin(), test.end(), 0); // is also possible
}
int main() {
aa(10);
return 0;
}