数组/指针混淆

时间:2013-01-25 08:37:47

标签: c++

为什么以下代码打印出"0 0 0 0 0 0 0 "?我期待"1 3 6 10 15 21 28 "

#include <iostream>

using namespace std;

void PrefixSum(float * input, float * output, int n){
    float sum = 0;
    for (int i=0;i<n;i++){
        float value = input[i];
        sum += value;
        output[n] = sum;
    }    
}


int main(int argc, const char * argv[])
{
    float input[] = {1,2,3,4,5,6,7};
    float output[] = {0,0,0,0,0,0,0};
    PrefixSum(input, output, 7);
    for (int i=0;i<7;i++){
        cout << output[i] << " ";
    }
    return 0;
}

5 个答案:

答案 0 :(得分:9)

output[n]更改为output[i],而不是写入数组中的任何索引,因为output[7]超出范围。 i是您的循环计数器n

答案 1 :(得分:4)

变化

output[n] = sum;

output[i] = sum;

答案 2 :(得分:4)

正如大家所指出的那样,你使用n作为索引而不是i,所以你永远不会修改数组中的任何值。

写循环很容易出错,我们很多人多年来都会犯错误。重用现有代码会更好。

您正在计算partial_sum。使用标准库,您可以像这样编码:

#include <iostream>
#include <numeric>

int main(int argc, const char * argv[])
{
    using std::partial_sum;
    using std::cout;

    const int SIZE = 7;
    float input[SIZE] = {1,2,3,4,5,6,7};
    float output[SIZE] = {0,0,0,0,0,0,0};

    partial_sum(input, input+SIZE, output);

    for (int i=0;i<SIZE;i++){
        cout << output[i] << " ";
    }
    return 0;
}

我们也可以消除循环打印结果:

#include <algorithm>
#include <iterator>

//...

using std::copy;
using std::ostream_iterator;

copy(output, output+SIZE,
     ostream_iterator<float>(cout, " "));

最后,如果您不需要中间结果数组,我们可以直接将结果放到ostream

partial_sum(input, input+SIZE,
            ostream_iterator<float>(cout, " "));

答案 3 :(得分:3)

output[n] = sum;n 7超出output数组边界,每次都会向其写入数据。注意,这也是未定义的行为。你正在访问float value = input[i]; for for循环,所以我猜这只是一个错字。

更新

output[n] = sum;

output[i] = sum;

答案 4 :(得分:2)

在PrefixSum的for-iteration中将'n'替换为'i';)