我正在通过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;
}
答案 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
。