我知道在C99中你可以声明一个数组,其大小是参数的值,如下所示:
void foo(int size) {
int array[size];
// do stuff
}
根据我的理解,它在调用函数时被分配在堆栈上。显然这不适用于C ++。
最近我在C ++中写了这样的东西:
void bar(vector<Thing> vec) {
for (Thing t : vec) {
int n = t.get_n();
int array[n];
// do stuff
}
}
令人惊讶的是,编译器(G ++)没有抱怨,为什么? 那里有隐藏的内存分配吗?
答案 0 :(得分:4)
可变长度数组不是C ++标准的一部分。它是G ++提供的扩展。
如果你用-pedantic
标志编译它,那么编译器会发出警告。
答案 1 :(得分:3)
Gcc默认允许C ++中的可变长度数组(又称VLA),即使它不符合标准。
如果您通过传递(例如)-std=c++14
选项告诉它严格遵守标准,那么它将正确拒绝您的代码。