0

我创建了这段代码来解决一些有效的在线答案,但我想知道以这种方式分配动态内存是否可以。数组大小在整个循环中连续定义。没事吧?

#include <iostream>
using namespace std;

int main ()
{
    int sum=0;
    int x;
    int *ptr = new int[x];
    ptr[0]=1;
    ptr[1]=2;

    int max = 4000000;

    int i=2;

    while (ptr[i-2]<max)            
    {
        ptr[i]=ptr[i-1]+ptr[i-2];
        i++;
    }
    // now we use (i -1) as the last array fill b/c i is bigger than 4 000 000
    // sort with val % 2 == 0  !modulus!

    for (int j=0; j<(i-1); j++) {
        if (ptr[j]%2==0) {
            sum+=ptr[j];
        }
    }

    delete[] ptr;

    cout<<sum;
    return 0;
}
4

4 回答 4

2

不,这不行,因为int x;它未初始化并且可能包含一些垃圾。
编辑。
从评论到这篇文章。
1) 使用std::vector<int>而不是 C 数组。
2)如果不想使用向量 - 添加循环计算元素,然后为数组分配内存并使用它。
3)如果第一种和第二种情况没有接近,请使用一些大尺寸的静态数组。

于 2012-07-19T04:16:40.333 回答
0

不,因为int x未初始化!

于 2012-07-19T04:25:27.193 回答
0

您的代码存在许多问题:

  1. x未初始化为初始值,因此它可能是一些随机值。
  2. while循环使用意味着ptr[i-2] < max(i) 需要至少两个数组元素,即x必须设置为不低于 2 的数字,并且 (ii)< max正在比较数组中的值但没有索引检查 i 是在 2 和用 分配的数组元素的数量之间new。(当 (ii)i++while循环中与 with 结合时,这意味着它i可能会在分配数组的末尾继续增加。

您需要设置x为正确的值并添加检查以确保您在访问数组的代码中永远不会访问任何数组索引 < 0 或任何索引 >= x ptr

std::vector如果您自己手动管理内存,请考虑改用。

编辑:看起来您的代码打算计算斐波那契数列并对偶数求和。要修复您的代码,应该这样做:

  1. 添加#include <vector>.
  2. 删除int x;
  3. 删除int *ptr = new int[x];并替换为std::vector<int> v;.
  4. 替换ptr[0]=1v.push_back(1);
  5. 替换ptr[1]=2v.push_back(2);
  6. 替换整个 while 循环。

由于您似乎正在计算斐波那契数列,因此您可以int i=2在 for 循环的初始化部分循环使用,同时v.back() < max每次添加一个,即++i. For 循环对此非常有用。在循环中,您可以v.push_back(v[i-1],v[i-2]);计算下一个数字并将其附加到数组中。

至于v.push_back(val)这将添加val到向量的末尾(即最高索引),如果需要,增长向量(内部使用动态内存)。v.back()是向量的最后一个元素,即v[v.size()-1]仅当v.empty()is时等价于false

  1. 您的评论提到了 for 循环计算更大的值。但是,您的 while 循环不会-- 不是i-2倒数i-1第二个元素 -- 而不是最后一个元素。当且仅当它 >= 4000000 时,使用std::vector它更容易简单地删除最后一个元素。这可以使用 if 语句来处理,即if (v.back() >= max)then v.pop_back();
  2. 调整你的 for 循环(即i应该是v.size())。
  3. 删除delete[] ptr;

如果您想直接使用动态内存分配,那么代码必须以不同的方式编写,并且会更长更复杂,因为您必须能够“调整”数组的大小(这需要分配更多内存,将旧内容复制到新的,然后摧毁旧的)。但是,一般来说,您应该使用标准库容器并避免直接管理内存。在这种情况下std::vector,仅使用几行代码就非常适合执行此任务。

于 2012-07-19T04:31:37.503 回答
0

如前所述,x当您尝试将其用作要分配的数组大小时,它是未初始化的。

然而,更重要的是,那时您并不真正知道您需要多大的数组(我很确定它可以计算出来,但我们现在暂且不说)。

由于您事先不知道大小,因此您几乎需要分配一些空间,产生一些结果,检查大小,腾出更多所需空间,然后继续直到达到目标。或者,您可以做一些非常微不足道的数学运算,对可能的最大尺寸给出一个安全(如果有些松散)的估计。由于您从 1、2 开始,并且每个单元格都会比前一个单元格大,因此可以肯定地说,所需的最大可能大小不会超过max/2 = 2000000.

或者,您可以只使用std::vector,它已经为处理此类情况而构建。

于 2012-07-19T04:31:44.180 回答