似乎可以使用返回指针加倍,以便使用cout正确打印值

时间:2018-05-03 13:24:05

标签: c++ pointers printf cout

我无法打印屏幕返回指针指向的值与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 &sum;
}


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;
}

提前致谢。

4 个答案:

答案 0 :(得分:0)

你不能将函数参数声明为static,也试图在局部变量上返回指针,但是当函数离开其范围时,其局部变量不再存在。如果要在double上获得有效指针,则需要通过引用传递sum:

double * addVAT(double& sum) // takes reference
{
    sum = sum + (sum*VAT); 
    return &sum;
}

但是这个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 &sum;
}

您需要从参数列表中删除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;
}