这个简单的代码在Dev C ++中引入。在此代码中,不使用变量f
和a
。删除或评论后,程序挂起。为什么呢?
#include <iostream>
#include <vector>
using namespace std;
#define N 10*1000*1000
bool p[N];
int f[N], a[N];
vector<int> primes;
int main()
{
for(int i=2 ; i<=N ; i++)
if(!p[i])
{
for(int j=i ; j<=N ; j+=i)
p[j]=true;// or =1
primes.push_back(i);
}
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:5)
您正在读取/写入p数组的边界。
在内存中,在p [N]数组到达f [N]数组之后,然后是a [N]数组。
所以当你试图写p [n]时,你实际上会写f [0]。
当您删除f和数组时,您将从vector&lt;中读取内容。 int&gt;素数。
vector是一个类,所以你可以搞一些重要的东西。我的猜测是,在j == N时,你的代码会在push_back调用时冻结。
答案 1 :(得分:3)
因为你的索引最多,包括 N,你需要这样:
#define N (10*1000*1000)
bool p[N+1];
因为p[N]
只有索引 0 ...(N-1)。
另请注意添加到 #define 的()
。总是使用这些,否则你可能会得到有趣的结果,因为N
不是 10000000
,代码中的N
是10*1000*1000
。< / p>
使用未使用的变量,当您在无效索引处访问p
时,您可能正在访问未使用变量的内存,并且没有任何反应(这次,这是未定义的行为,所以“任何”可以发生)。但是当你删除未使用的变量时,你实际上会覆盖vector
对象的数据,破坏它,然后“未定义的行为”导致崩溃(它也可能导致更糟糕的结果)。