函数返回意外的结构值

Function returning unexpected struct values

本文关键字:结构 意外 返回 函数      更新时间:2023-10-16

我对结构体和用户定义的数据类型完全陌生,我试图创建一个返回结构体的函数:

这个问题通过注释来突出显示:

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

在main中你可以直接写

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) 

应该能解决你的问题