C ++局部变量改变了值

时间:2011-09-02 18:24:04

标签: c++ local

我有以下c ++函数,即尝试在负整数和正整数数组中找到最大子阵列总和

int  MaxSubArray::find_max_subarray(void) {
  int maxsofar =0 ;
  int maxendinghere = 0;
  for(int i = 0;i <= arr_size; i++) {
    cout << "maxending here is: " << maxendinghere << endl;
    cout << "maxsofar is: " << maxsofar << endl;
    maxendinghere += array[i];
    maxendinghere = max(0,maxendinghere);
    maxsofar = max(maxendinghere,maxsofar);
  }
  int retvalue = maxsofar;
  cout << "Max so far final is" << maxsofar << endl;
  cout << "Max ending here is " << maxendinghere << endl;
  return retvalue;

}

对于包含10,20,30,-50,50的数组,我得到以下输出

maxending here is: 0
maxsofar is: 0
maxending here is: 10
maxsofar is: 10
maxending here is: 30
maxsofar is: 30
maxending here is: 60
maxsofar is: 60
maxending here is: 10
maxsofar is: 60
maxending here is: 60
maxsofar is: 60
Max so far final is135205
Max ending here is 135205
Max sub array is 135205

任何人都可以告诉我为什么变量maxsofar在for循环之外将值更改为135205。 提前致谢

9 个答案:

答案 0 :(得分:4)

不应该是:

for(int i = 0; i < arr_size; i++)

请注意,在打印之后,在最后一次循环迭代中修改maxsofar,这就是为什么你会看到差异 - 你可能会添加一个垃圾值最后一次迭代,因为你的逐个循环边界。

希望你喜欢编程珍珠

答案 1 :(得分:2)

for(int i = 0;i <= arr_size; i++)

应该是

for(int i = 0; i < arr_size; i++)
                ^^^

你超越了阵列界限。

答案 2 :(得分:1)

for(int i = 0;i <= arr_size; i++) {

当然不应该是<?通常size表示0到size-1是该数组的有效索引。

 for(int i = 0;i < arr_size; i++) {

这可能会导致您覆盖数组并写入另一个堆栈变量。

答案 3 :(得分:1)

假设arr_size实际上是数组的大小,那么你的<=运算符会导致你运行一个结尾,addind垃圾到总和。

答案 4 :(得分:1)

由于循环约束:

for(int i = 0;i <= arr_size; i++)

你正在做一个额外的步骤,所以你正在查看一个在数组之外的索引,因此有一些随机值。

应该是:

for(int i = 0;i < arr_size; i++)

答案 5 :(得分:1)

那是因为你已经读过数组范围之外的垃圾:

for(int i = 0;i <= arr_size; i++) { // should be i < arr_size

答案 6 :(得分:0)

你的循环中的数组大小溢出。 for循环应为:

for(int i = 0;i < arr_size; i++)

请注意代码中的<=与上面<之间的差异。进行适当的更改,您不会溢出阵列。 :)

答案 7 :(得分:0)

i <= arr_size

应该是

i < arr_size

答案 8 :(得分:0)

您在循环顶部打印出maxsofar,因此您无法捕获迭代后其值。这些值在循环内部被更改,而不是在它之外。

这在你的情况下特别有害,因为正如其他人所指出的那样,你的最后一次迭代超过了数组的末尾,为你的计数器添加了一个无意义的值。

迭代数组的惯用方法是:

for (int i = 0; i < length; ++i)
{
   // do Stuff
}