删除未使用的变量后的c++挂起

C++ hangUp after removing unused variables

本文关键字:c++ 挂起 变量 未使用 删除      更新时间:2023-10-16

这个简单的代码是在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;
}

您正在读取/写入p数组的边界。

在内存中,在p[N]数组之后是f[N]数组,然后是a[N]数组。

所以当你想写p[n]时,你实际上会写f[0]。

当你删除f和数组时,你将写入vector 质数

vector是一个类,所以你搞砸了一些重要的东西。我的猜测是,当j == N时,在push_back调用时,代码将冻结。

因为你索引到,并且包括 N,你需要有这个:

#define N  (10*1000*1000)
bool p[N+1];
<<p>因为p[N]只有索引em> 0…(n - 1) 。

还要注意添加到#define中的()。总是使用这些,否则你可能会以有趣的结果告终,因为N而不是 10000000, N在你的代码中是10*1000*1000


对于未使用的变量,当您在无效索引下访问p时,您可能正在访问未使用变量的内存,并且没有发生任何事情(这次,这是未定义行为,因此"任何事情"都可能发生)。但是,当您删除未使用的变量时,您实际上覆盖了vector对象的数据,损坏了它,然后"未定义行为"导致崩溃(也可能有更糟糕的结果)。