我的数组有错误的值

时间:2015-03-05 22:58:46

标签: c++ arrays

我正在通过Stephen Prata的C ++ Primer Plus工作。请帮忙!我的程序将10个或更少的int值(高尔夫分数)读入数组,然后调用函数打印出值和平均值。我尽可能地使用了代码:: blocks debugger。通过输入函数提示我得到了正确的值到该区域但是当我将* int ptr返回到显示功能时,当我打印出来时,值是不同的。我怀疑我对指针的使用是不正确的,因为我只是在了解它们。如果有人发现我有任何明显的错误,如果你指出它们,我将非常感激。我已经这么久了,我迷失了。以下是所有代码:

#include <iostream>

using namespace std;

const int SIZE = 10;

int* input()
{
    int scores[10] = {0};

    int score = 0;

    for(int i = 0; i < SIZE; i++)
    {
        cout << "Enter golf score: " << endl;
        if(cin >> score)
        {
              scores[i] = score;
        }
        else
            break;

    }
    return scores;
}

float average(int* p_ints)
{
    float sum = 0;
    int i = 0;
    while(p_ints[i] != 0 && i < SIZE)
    {
        sum += float(p_ints[i]);
        i++;
    }
    return sum/i;
}

void display(int* p_ints)
{
    cout << "scores: ";
    int i = 0;
    while(p_ints[i] != 0 && i < SIZE)
    {
        cout << p_ints[i] << " ";
        i++;
    }
    cout << "average: " << average(p_ints) << endl;
}



int main()
{
    int* p_ints = input();
    display(p_ints);
    return 0;
}

1 个答案:

答案 0 :(得分:5)

您的问题是input()返回指向本地构造对象的指针

int scores[10] = {0};

// ...

return scores; // PROBLEM HERE, scores goes out of scope and its memory re-claimed by the OS

当您退出函数input时,scores超出了范围,您最终得到了所谓的dangling pointer

因此,要么为scores动态分配内存,

int* scores = new int[10]{0}; // this memory is not being automatically reused by the OS at exit from the function

并且在使用后不要忘记delete[]返回的指针,或者(更好)将指针scores(您要填充的内存)传递给函数{{1} }作为参数

input

或者,更好的是,使用标准的C ++容器,如void input(int* scores) // pass a pointer to the output array