C ++初始化bool数组

时间:2015-10-12 13:15:28

标签: c++

我使用memset来初始化bool数组。但是,答案并非如此。谁能告诉我原因?

int countPrimes(int n) {
    bool *flag = new bool[n];
    int i, res = 0;
    memset(flag,false,sizeof(flag));
    for (i = 0 ; i<n ; i++) {

Incorrect output

3 个答案:

答案 0 :(得分:2)

问题是sizeof(flag)不知道分配给指针flag的数组的大小。指针的大小对于体系结构是固定的,这意味着只有动态数组的初始部分才会被初始化(或者如果n很小,则会导致未定义的行为)。

如果你坚持使用&#34; plain&#34;数组bool,将初始化代码更改为:

memset(flags, false, sizeof(*flags)*n); // Wouldn't work with true

更好的方法是使用std::vector<bool>,它使用一种实现,与&#34; plain&#34;相比,可以节省大量内存。数组bool

int countPrimes(int n) {
    std::vector<bool> flag(n, false);
    int res = 0;
    for (int i = 0 ; i != n ; i++) {
        ...
    }
    return res;
}

请注意,std::vector<bool>的使用使您无需在完成动态分配的数组后调用delete[] flags

答案 1 :(得分:2)

在C ++中,我们使用std::fill

bool* flags = new bool[n];
std::fill(flags, flags+n, false); // Also works with `true`.

答案 2 :(得分:0)

数组项的大小为sizeof(bool)或等效sizeof *flag,数组的大小为n*sizeof(bool)n*sizeof *flag不是 { {1}}。值sizeof flag很可能是4(指针类型的大小),因此您的数组的4个项目设置为sizeof flag0)。< / p>