函数返回意外的结构值
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 + y
和s1.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)
应该能解决你的问题
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 在 mingw 的 gcc-5.3 下具有混合位域和枚举递减的结构的意外大小
- 结构向量的值发生意外变化
- 使用 if-else 控制结构的意外输出
- 将结构传递给函数时出现意外结果
- 位字段结构分配意外行为
- 当传入具有std::string成员的结构时,C++-gdb会给出意外的输出
- 收到有关压缩结构的意外编译警告
- 函数返回意外的结构值
- 当从固定结构体中存储的对象构建函数时,c++ lambda构建静态函数返回意外值
- 在宿主结构体上设置指针时出现意外结果