繁体   English   中英

C++ 初始化 bool 数组

[英]C++ initialize bool array

我使用 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++) {

错误的输出

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

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

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

如果您坚持使用bool “普通”数组,请将初始化代码更改为:

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

更好的方法是使用std::vector<bool> ,它使用的实现与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

数组项的大小是sizeof(bool)或等效的sizeof *flag ,数组的大小是n*sizeof(bool)n*sizeof *flag而不是sizeof flag sizeof flag很可能是 4(指针类型的大小),因此数组的 4 个项目被设置为0 ( false )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM