Проблемы с использованием динамического логического массива - PullRequest
2 голосов
/ 10 июля 2019

Я хочу динамически объявить логический массив для моей программы на C ++ и установить его значение в false. У меня проблемы с выделением памяти. Я думаю, как и получая висячий указатель, я пытаюсь найти простые числа с помощью Sieve of Eratosthenes.пытаюсь использовать логический массив динамически, но сталкиваюсь с проблемами.

Я не пытаюсь реализовать его с помощью 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)

1 Ответ

2 голосов
/ 10 июля 2019

Я чувствую, что вы новичок в C ++.

"ложь" обычно равна нулю, поэтому вы ничего не выделяете.

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. Поэтому используйте k<limit в цикле for.

...