繁体   English   中英

函数返回意外的struct值

[英]Function returning unexpected struct values

我是结构和用户定义的数据类型的新手,我试图创建一个返回结构的函数:

评论突出了问题:

#include <iostream>

using namespace std;

struct num {
    int n[2];
};

num func( num x, int a, int b) {
    x.n[0] = a+b;
    x.n[1] = a*b;
    return x;
}

int main() {
    int x,y;
    num s1;
    cout << "enter: ";
    cin >> x >> y;
    func(s1,x,y);
    cout << s1.n[0] << "\n" << s1.n[1];        // THIS GIVES ERROR
    cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];  // THIS DOENST GIVE ERROR
    return 0;
}

我理解第二种方法有意义并返回struct变量。 然后放一个点来解决struct的内部变量。

但我不明白为什么第一种方法失败 ,或给出奇数输出。 该函数已完成其工作,即使s1.n[0] = x + ys1.n[1] = x*y
现在,打印s1.n[0]应该只打印x + y 我们如何检查和纠正函数的内部工作原理?

您必须将返回的值分配给main中的结构对象

s1 = func(s1,x,y);

在体内,该函数处理原始对象的副本。 它不会更改原始对象,因为它是按值传递的。

另一种方法是通过引用传递结构

void func( num &x, int a, int b) {
    x.n[0] = a+b;
    x.n[1] = a*b;
}

在这种情况下,你可以写

func(s1,x,y);

或者你可以使用甚至所谓的C方法通过引用传递

void func( num *x, int a, int b) {
    x->n[0] = a+b;
    x->n[1] = a*b;
}

并称之为

func( &s1, x, y );

至于这个说法

cout << func(s1,x,y).n[0] << "\n" << func(s1,x,y).n[1];  

然后您访问由函数的两次调用返回的两个临时对象的数据成员。 执行此语句后,将删除这些临时对象。

看起来你永远不会分配func()的返回值。 您的函数返回结构,但您永远不会分配它。 要解决这个问题,你应该能够简单地说: s1 = func(s1,x,y); 这会将结构的修改版本分配给s1变量。

或者,您可以重写func()以接受指向结构的指针。 这将允许您修改结构而不必返回它:

 void func( num *x, int a, int b) {
     x->n[0] = a+b;
     x->n[1] = a*b;
 }

然后你只需要调用func()来调用: func(&s1, x, y);

您没有通过引用传递结构,因此结果。 请尝试以下方法:

void func(num &x, int a, int b) { 
    x.n[0] = a+b;
    x.n[1] = a*b;
}

由于你的结构是通过引用传递的,所以函数不需要返回任何内容,无论如何它都会被更改。 虚空会更合适。

这是因为您已经按值传递了结构,而您的意图看起来像是要通过引用传递。 查看此链接: http//courses.washington.edu/css342/zander/css332/passby.html

num func( num &x, int a, int b) 

应该解决你的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM