这是分配非常数数组的合法举措吗?

时间:2012-07-19 04:14:54

标签: c++

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

#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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

不,因为int x未初始化!

答案 2 :(得分:0)

您的代码存在许多问题:

  1. x未初始化为初始值,因此可能是某个随机值。
  2. while循环使用ptr[i-2] < max,这意味着(i)需要至少有两个数组元素,即x必须设置为不低于2的数字和( ii)< max正在比较数组中的值BUT没有索引检查i在2和分配有new的数组元素的数量之间。 (当(ii)与i++循环中的while耦合时,意味着i可能会在分配的数组末尾之后继续增长。
  3. 您需要将x设置为正确的值并添加检查以确保您永远不会访问任何数组索引&lt;您访问ptr数组的代码中的0或任何索引&gt; = x。

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

    编辑:看起来您的代码打算计算Fibonacci序列并进行偶数和。要修复代码,应该这样做:

    1. 添加#include <vector>
    2. 删除int x;
    3. 删除int *ptr = new int[x];并将其替换为std::vector<int> v;
    4. ptr[0]=1替换为v.push_back(1);
    5. ptr[1]=2替换为v.push_back(2);
    6. 替换整个while循环。
    7. 由于您正在计算Fibonacci序列,因此您可以在for循环的初始化部分使用int i=2循环,而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()时才相当于false

      1. 您的评论提到for循环计算更大的值。但是,你的while循环执行i-2 - not i-1这是倒数第二个元素 - 而不是最后一个元素。使用std::vector,当且仅当它是&gt; = 4000000时,才更容易删除最后一个元素。这可以使用if语句处理,即if (v.back() >= max)然后v.pop_back();。< / LI>
      2. 调整for循环(即i应为v.size())。
      3. 删除delete[] ptr;
      4. 如果你想直接使用动态内存分配 那么代码必须以不同的方式编写,并且会更长更复杂,因为你必须能够“调整”数组的大小(需要分配更多内存,将旧内容复制到新内容中,然后销毁旧内容。但是,通常应使用标准库容器并避免直接管理内存。在这种情况下,std::vector非常适合仅使用几行代码执行此任务。

答案 3 :(得分:0)

如前所述,当您尝试将x用作要分配的数组大小时,max/2 = 2000000未初始化。

更重要的是,在那一点上,你并没有真正知道你需要多大的数组(我很确定可以计算 ,但我们现在就离开了。)

由于你不知道前面的尺寸,你几乎需要分配一些空间,产生一些结果,检查尺寸,增加所需的空间,并继续直到达到你的目标。或者,你可以做一些真正的琐碎的数学运算,它可以给出一个安全(如果有点宽松)的最大尺寸估计。由于您从1,2开始,并且每个单元格将比之前的单元格更大,因此可以肯定地说所需的最大可能大小不会超过std::vector

或者,您可以使用{{1}},它已经构建用于处理这样的情况。