今天,我尝试对Eratosthenes的Sieve进行编程,并且可以为我提供质数。但是我不了解动态数组的问题。

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

第二个问题:如果我输入一个类似50的值,它可以给出正确的质数,但是在删除数组之前会崩溃。

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

但是我不明白为什么它的行为如此不同。 120个 bool(boolean) 值不会使我的内存崩溃,至少我认为是这样。为什么它不能删除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;

最佳答案

您的问题在这里:

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

没有检查是否为j < n,因此在j >= n时您要踩踏未分配的内存。

10-08 18:07