【问题标题】:Issues using dynamic boolean array使用动态布尔数组的问题
【发布时间】:2019-11-20 06:49:48
【问题描述】:

我想为我的 C++ 程序动态声明一个布尔数组并将其值设置为 false。我遇到了内存分配问题我猜如何获得一个悬空指针 我正在尝试通过 Eratosthenes 的 Sieve 查找素数我正在尝试动态使用布尔数组但面临问题。

我没有尝试使用 memset 来实现它。

int  limit = 2000000 ;
int crossLimit = sqrt(limit) ;


void  SievePrime(int limit)
{

    bool* boolArray = new bool[false] ;

    for(int i =4;i<=limit ;i = i + 2)
    {
        boolArray[i] = true ; //getting error hereThread 1:                       
                         //EXC_BAD_ACCESS (code=2, address=0x100786000)
    }

    for(int j= 3 ;j<=crossLimit ; j= j+2){
        if (not boolArray[j])

        {
            for(int k =j*j;k<=limit;k*=2)
        {
            boolArray[k] = true ;
        }
    }
}

    double sum = 0 ;

    for(int i =2 ; i<=limit ;i++)
    {
        if(!boolArray[i])
        {
            sum = sum + i ;
        }
    }

    cout<<sum<<endl ;
}

预期输出: 142913828922

错误:线程 1:EXC_BAD_ACCESS(代码=2,地址=0x100786000)

【问题讨论】:

  • bool* boolArray = new bool[false] ; 你觉得你在这里做什么?
  • 将索引值设为假
  • 您在new bool[...] 中给出的值应该是您的数组的大小,它与您的数组元素的值不对应。所以问题是你正在遍历一个分配不善的数组
  • 这里false0

标签: c++ arrays dynamic boolean


【解决方案1】:

我感觉您是 C++ 新手。

"false" 通常为零,因此您不会分配任何东西。

bool* boolArray = new bool[false] ;

试试:

bool* boolArray = new bool[limit];


for(int i =0; i<limit; i+)
{
    boolArray[i] = false;                       
}

并在最后添加一个删除:

delete boolArray;

此外,该循环将超出界限。如果您有 N 个项目,则最后一个有效条目是 N-1,因为第一个是 0。所以在 for 循环中使用 k&lt;limit

【讨论】:

  • 好的,这意味着必须在声明时指定数组大小。但是这 200 万个索引中的项目的值是多少。默认情况下是否设置为 false?
  • @NajmusSaqibMakhdoomi 除非你对它们进行值初始化(你可以通过bool *boolArray = new bool[limit]();(注意末尾的括号)。相关,尽管性能不太好,std::vector&lt;bool&gt; ar(limit+1);也可以工作,使您不必在最后动态释放,并且与现代 C++ 更加内联,其中 newdelete 在用户程序中几乎不需要。我添加了 +1 因为你的循环运行通过limit; 不只是差一个,因此你会在没有增加大小的情况下突破。
  • 如果有一个初始化循环如何工作的例子,这个答案会更好。
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 2019-10-06
  • 2011-08-05
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
相关资源
最近更新 更多