我刚刚开始在Code :: Blocks上学习C ++,并且正在通过new和delete运算符进行动态内存分配的练习。主要功能允许用户请求存储多个元素,然后将值分配给这些元素/存储位置。我想创建一个单独的函数void sum(int pntsize,int * pnt),该函数在调用时允许用户查找所分配值的总和。由于这些值是通过指针分配的,因此在创建该函数时遇到了麻烦。当我去编译程序时,没有错误。但是,无论输入的值或创建的元素数量如何,总和始终返回1。尽管没有错误,但Code :: Blocks会给出警告,指出:“'void sum(int,int *)'的地址”总是评估为'true'[-Waddress]”,我希望这与我遇到的问题有关。下面是r
#include <iostream>
using namespace std;
void sum(int pntsize, int* pnt)
{
for(int i=0; i<pntsize; i++)
{
int sum = 0;
sum = *(pnt+i) + sum;
}
cout << "The sum of these values is: " << sum;
}
int main()
{
for (char userinput2 = 'y'; userinput2 == 'y';)
{cout << "For how many elements do you wish to reserve memory?" << endl;
int pntsize = 1;
cin >> pntsize;
cout << endl;
int* pnt = new int [pntsize];
for (int i=0; i<pntsize; i++) //Assigns values
{
cout << "Enter a value for Memory Slot " << i << ": ";
cin >> *(pnt + i);
}
cout << endl;
for (int i2=0; i2<pntsize; i2++) //Displays values
{
cout << "Value at Memory Location " << &(pnt[i2]) << ": " << *(pnt + i2) << endl;
}
cout << endl;
cout << "Do you wish to find the sum of these values?" << endl; //Adds values
char userinput3;
cin >> userinput3;
if (userinput3 == 'y')
sum(pntsize, pnt);
return 0;
}
}
警告可能与我的问题无关,但也许有人可以解释为什么这个问题不断出现。
答案 0 :(得分:2)
您要在for循环中重新声明sum。因此,在每次迭代时,它将重新初始化为零。试试:
void sum(int pntsize, int* pnt)
{
int res = 0;
for(int i=0; i<pntsize; i++)
{
res = *(pnt+i) + res;
}
cout << "The sum of these values is: " << res;
}
顺便说一句,由于int已超出范围,所以sum实际是指实际函数sum()。我认为这就是您收到此警告的原因。
答案 1 :(得分:1)
cout<<"The sum of these values is: " << sum;
<-sum
解析为函数名称。您可能打算在for循环中使用局部变量。但是在声明的范围({}
)之外不可见。同样,您的方法不会累加任何东西,因为每次迭代都会创建,初始化和销毁变量。
修复:
void sum(int pntsize, int* pnt)
{
int sum = 0;
for(int i=0; i<pntsize; i++)
{
sum = *(pnt+i) + sum;
}
cout << "The sum of these values is: " << sum;
}
也请不要使用new
,而要使用std::unique_ptr
。为什么?因为您已经忘记删除它了。