我无法打印屏幕返回指针指向的值与cout加倍,如果我使用printf而不是正确打印值,如果我使用指针加倍我在cout函数内部声明它也打印正确,如果我调试我看到指针双重正确返回它的值(注意我指向静态而不是本地),不能理解这里的错误是什么#s; s代码(在Visual Studio 2017社区版中成功编译)。
#include "stdafx.h"
#include <iostream>
using namespace std;
const double VAT=0.17;
double * addVAT(static double sum)
{
sum = sum + (sum*VAT);
return ∑
}
int main()
{
double total = 120;
double *totalWithVat;
cout << "Type the total before VAT:";
cin >> total;
totalWithVat = addVAT(total);
printf("The total with VAT is: %f \n", *totalWithVat);
cout << *totalWithVat << endl;
}
提前致谢。
答案 0 :(得分:0)
你不能将函数参数声明为static
,也试图在局部变量上返回指针,但是当函数离开其范围时,其局部变量不再存在。如果要在double上获得有效指针,则需要通过引用传递sum:
double * addVAT(double& sum) // takes reference
{
sum = sum + (sum*VAT);
return ∑
}
但是这个double * addVAT(double&amp; sum)函数会将传递的变量改为它,在这里总调用方法后会改变
int main()
{
//...
totalWithVat = addVAT(total);// in addVAT sum will referenced to total from main's scope, so it will return pointer to total
std::cout << total; // will print the same as totalWithVat
std::cout << totalWithVat; // will print the same as total, totalWithVat points to total
//...
}
如果您不想修改total
,请按值传递并返回双值,如下所示:
double addVAT(double sum)
{
sum = sum + (sum*VAT);
return sum;
}
答案 1 :(得分:0)
只需使用常规功能:
double totalWithVAT( double sum )
{
const double vat = 1.17;
return sum * vat;
}
std::cout << "The total with VAT is:" << totalWithVAT( total ) << std::endl;
答案 2 :(得分:0)
我们来看看您的addVat
功能。
double * addVAT(static double sum)
{
sum = sum + (sum*VAT);
return ∑
}
您需要从参数列表中删除static
。至少在Linux上使用GCC会导致编译错误。当我这样做时,我得到了
<source>: In function 'double* addVAT(double)':
<source>:8:24: warning: address of local variable 'sum' returned
[-Wreturn-local-addr]
double * addVAT(double sum)
~~~~~~~^~~
Compiler returned: 0
有点我的期望。
在main
total
中,您将{strong>作为副本传递给addVat
,其中sum
的名称为sum
。所以在内存中(在运行时堆栈上)你有
主:总 main-&GT; addVat:总和
addVat修改addVat
并返回指向它的指针。问题是返回后,sum
会自动释放包含sum
的内存。
所以现在你有了
主要:总数(不变)
main:totalWithVat - &gt;记忆sum
曾经是
这是未定义的行为。它可能会起作用,但也有一些其他例程可能会重复使用并修改printf
曾经存在的内存。这可能就是你所看到的。 sum
很幸运,获得cout
的未修改值,而void addVat(double& sum)
{
sum += sum*VAT;
}
double total = 1.0;
addVat(total);
// total now ~1.17
获得修改后的值。
作为解决问题的方法,有两种可能性。您可以只修改一个输入值,例如
double addVat(double sum)
{
return sum + sum*VAT;
}
double total = 1.0;
double totalWithVat = addVat(total);
// totalWithVat now ~1.17
或者你可以有两个值而不用打扰指针/引用
s
答案 3 :(得分:0)
修复是从参数中删除静态并传递指针而不是静态,奇怪的是旧代码编译并与printf一起成功运行,这是正确的代码,它在cout和printf中都有效:
#include "stdafx.h"
#include <iostream>
using namespace std;
const double VAT=0.17;
double * addVAT(double *sum)
{
*sum = *sum + (*sum*VAT);
return sum;
}
int main()
{
double varTotal = 0;
double *total;
total = &varTotal;
double *totalWithVat;
cout << "Type the total before VAT:";
cin >> *total;
totalWithVat = addVAT(total);
printf("The total with VAT is: %f \n", *totalWithVat);
cout << *totalWithVat << endl;
}
只要我不在参数列表中放置静态它就可以正常工作,所以我也可以像这样编写代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
const double VAT = 0.17;
double * addVAT(double sum)
{
static double sumstatic = sum;
sumstatic = sumstatic + (sumstatic*VAT);
return &sumstatic;
}
int main()
{
double varTotal = 0;
double total;
double *totalWithVat;
cout << "Type the total before VAT:";
cin >> total;
totalWithVat = addVAT(total);
printf("The total with VAT is: %f \n", *totalWithVat);
cout << "The total with VAT is: " << *totalWithVat << endl;
}