C ++为什么可以“填充”初始化可变大小的数组?

问题描述 投票:2回答:4
#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;
}

没关系

我想知道在前一个失败的情况下编译该文件的原因。

c++ arrays stack clang++ variable-length-array
4个回答
3
投票

VLA不属于C ++。一些编译器支持它们作为扩展。它们来自C99,在C99中you cannot initialize VLA中带有= {0};。一些编译器(例如GCC)走得更远,并增加了对此类初始化的支持。在GCC中,可以从version 4.9开始使用此语法。 Clang显然不支持它,也不必这样做。


1
投票

您只能声明一个大小恒定的数组,该大小可以在编译时推导。变量n仅在运行时才能知道。

详细地说,当您在堆栈上分配内存时,必须在编译时知道大小。由于数组是方法的局部数组,因此将它们放置在堆栈中。


0
投票

对我来说都很好,我想这与您的编译器版本有关


0
投票

您的两个示例都不合法,因为n不是编译时间常数,并且标准C ++不允许非常量长度用于数组初始化(但是C允许。)>

第二个示例进行编译的原因是,您解决了第一个示例中编译器似乎唯一的问题,即未初始化。

[I recommend compiling with all compiler warnings enabled, which probably should be default anyway.您可以在GCC中启用它们,例如,使用-Wall -Wextra以及-Werror

您可能想改用std::vectorresize。如果是这样,您的代码将变为

#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;
}
© www.soinside.com 2019 - 2024. All rights reserved.