我已经创建了这个代码来解决一些有效的在线答案,但我想知道以这种方式分配动态内存是否可行。在整个循环中连续定义数组大小。好吗?
#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;
}
答案 0 :(得分:2)
不,这不合适,因为int x;
未初始化且可能包含一些垃圾。
修改强>
从评论到这篇文章。
1)使用std::vector<int>
代替C阵列
2)如果不想使用向量 - 添加计数元素的循环,然后为数组分配内存并使用它
3)如果第一种和第二种情况不接近,则使用一些大尺寸的静态数组。
答案 1 :(得分:0)
不,因为int x
未初始化!
答案 2 :(得分:0)
您的代码存在许多问题:
x
未初始化为初始值,因此可能是某个随机值。while
循环使用ptr[i-2] < max
,这意味着(i)需要至少有两个数组元素,即x
必须设置为不低于2的数字和( ii)< max
正在比较数组中的值BUT没有索引检查i在2和分配有new
的数组元素的数量之间。 (当(ii)与i++
循环中的while
耦合时,意味着i
可能会在分配的数组末尾之后继续增长。您需要将x
设置为正确的值并添加检查以确保您永远不会访问任何数组索引&lt;您访问ptr
数组的代码中的0或任何索引&gt; = x。
如果您自己手动管理内存,请考虑使用std::vector
。
编辑:看起来您的代码打算计算Fibonacci序列并进行偶数和。要修复代码,应该这样做:
#include <vector>
。int x;
int *ptr = new int[x];
并将其替换为std::vector<int> v;
。ptr[0]=1
替换为v.push_back(1);
。ptr[1]=2
替换为v.push_back(2);
。由于您正在计算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
。
i-2
- not i-1
这是倒数第二个元素 - 而不是最后一个元素。使用std::vector
,当且仅当它是&gt; = 4000000时,才更容易删除最后一个元素。这可以使用if语句处理,即if (v.back() >= max)
然后v.pop_back();
。< / LI>
i
应为v.size()
)。delete[] ptr;
。如果你想直接使用动态内存分配 那么代码必须以不同的方式编写,并且会更长更复杂,因为你必须能够“调整”数组的大小(需要分配更多内存,将旧内容复制到新内容中,然后销毁旧内容。但是,通常应使用标准库容器并避免直接管理内存。在这种情况下,std::vector
非常适合仅使用几行代码执行此任务。
答案 3 :(得分:0)
如前所述,当您尝试将x
用作要分配的数组大小时,max/2 = 2000000
未初始化。
更重要的是,在那一点上,你并没有真正知道你需要多大的数组(我很确定可以计算 ,但我们现在就离开了。)
由于你不知道前面的尺寸,你几乎需要分配一些空间,产生一些结果,检查尺寸,增加所需的空间,并继续直到达到你的目标。或者,你可以做一些真正的琐碎的数学运算,它可以给出一个安全(如果有点宽松)的最大尺寸估计。由于您从1,2开始,并且每个单元格将比之前的单元格更大,因此可以肯定地说所需的最大可能大小不会超过std::vector
。
或者,您可以使用{{1}},它已经构建用于处理这样的情况。