删除未使用的变量后的C ++ hangUp

时间:2014-08-01 07:47:13

标签: c++

这个简单的代码在Dev C ++中引入。在此代码中,不使用变量fa。删除或评论后,程序挂起。为什么呢?

#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;
}

2 个答案:

答案 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,代码中的N10*1000*1000。< / p>


使用未使用的变量,当您在无效索引处访问p时,您可能正在访问未使用变量的内存,并且没有任何反应(这次,这是未定义的行为,所以“任何”可以发生)。但是当你删除未使用的变量时,你实际上会覆盖vector对象的数据,破坏它,然后“未定义的行为”导致崩溃(它也可能导致更糟糕的结果)。