C ++动态bool数组导致崩溃

时间:2013-09-23 13:46:40

标签: c++ arrays dynamic crash boolean

今天我尝试编写了Eratosthenes的筛子,只要它为我提供了素数就可以了。但是我对动态数组有一个问题我不明白。

第一个问题:一旦我尝试输入n的“大”值(例如120),程序崩溃,它甚至不分配内存。

第二个问题:如果我输入一个像50这样的值,它能够给出正确的素数但在删除数组之前崩溃。

第三个问题:如果我输入一个非常小的值,如5,它能够执行整个程序,它会给出正确的数字并删除内存。

但我不明白为什么它的行为如此不同。 120布尔值不能破坏我的记忆,至少我是这么认为的。为什么它不能删除50个值的数组但实际上能够删除5个值的数组? 谁能告诉我这是什么问题?

int n;
cin >> n;
n=n+1;
bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    for(;j<n;j+=i)
        feld[j]=true;
}
for(int i=2;i<n;i++)
    if(!feld[i])
        cout << i << endl;
    else;
delete[] feld;
feld = NULL;

3 个答案:

答案 0 :(得分:6)

你的问题在这里:

int j=i*i;
feld[j]=true;

没有检查j < n是否在j >= n时踩踏未分配的内存。

答案 1 :(得分:5)

此代码错误

bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    ...
}

假设n == 10且i == 9,则j == 81但你的bool数组中只有10个元素。

当你编写错误的程序时,这就是它的工作原理,有时它似乎可以工作,它甚至可以给出正确的答案,有时它会崩溃。这是一个非常重要的教训,你很幸运能早点学习它。

答案 2 :(得分:0)

实际上feld[j]=true;不仅导致错误。

此外,在循环之前根本不需要该行。

因为,这是循环中的第一个案例。