1 c++ arrays crash boolean dynamic
今天我尝试编写了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;
Run Code Online (Sandbox Code Playgroud)
你的问题在这里:
int j=i*i;
feld[j]=true;
Run Code Online (Sandbox Code Playgroud)
没有检查是否j < n你正在踩踏未分配的内存j >= n.
这段代码错了
bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
int j=i*i;
feld[j]=true;
...
}
Run Code Online (Sandbox Code Playgroud)
假设n == 10且i == 9,则j == 81,但在bool数组中只有10个元素.
这就是当你编写有问题的程序时它的工作方式,有时似乎工作,它甚至可能给出正确的答案,有时它会崩溃.这是一个非常重要的一课,你很幸运能早点学到它.
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |