【问题标题】:C++ Dynamic bool array causes crashC ++动态布尔数组导致崩溃
【发布时间】:2013-09-28 10:46:11
【问题描述】:

今天我尝试对 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;

【问题讨论】:

  • 旁注:习惯于只使用英文变量名,在您第一次尝试阅读中文源代码后,您会喜欢这种约定;-)
  • 我不知道主要问题,但我注意到您在for 循环中有两个单独的int i;s。也许编译器会优化它,但不要指望它。考虑在较大的块中声明一个int i;,这样当您可以重复使用相同的值时,您就不必拥有两个。
  • 考虑将数组的长度写入输出,然后打印您将要尝试访问的密钥。也许然后使用 cin 或 getchar 暂停,直到你准备好。这可能会帮助您了解问题出在哪里。
  • 旁注:使用std::vector 比使用new 动态分配内存更好,主要(但不仅)是出于异常安全考虑
  • @Hulk:虽然vector&lt;bool&gt; 会让你感到惊讶,但如果你希望它表现得像其他风格的矢量。不过,它仍然(可能)是您想要的。

标签: c++ arrays dynamic crash boolean


【解决方案1】:

你的问题在这里:

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

没有检查j &lt; n 是否在j &gt;= n 时踩到未分配的内存。

【讨论】:

    【解决方案2】:

    这段代码是错误的

    bool *feld = new bool[n];
    for(int i=2;i<n;i++)
    {
        int j=i*i;
        feld[j]=true;
        ...
    }
    

    假设 n == 10 和 i == 9,那么 j == 81 但您的 bool 数组中只有 10 个元素。

    这就是你编写错误程序时的工作方式,有时它似乎工作,它甚至可能给出正确的答案,有时它会崩溃。这是非常重要的一课,你真的很幸运能早点学会。

    【讨论】:

      【解决方案3】:

      其实不只是feld[j]=true;导致错误。

      另外,在循环之前你根本不需要那行。

      因为,这是循环中的第一个案例。

      【讨论】:

        猜你喜欢
        • 2015-02-15
        • 2015-07-27
        • 1970-01-01
        • 2013-02-13
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-25
        • 2011-09-23
        相关资源
        最近更新 更多