请帮我解决这个意外的输出

Please help me get through this unexpected output

本文关键字:意外 输出 解决      更新时间:2023-10-16

这是我的链表示例c++代码。这实际上不是一个链表,而只是一个虚拟程序。我得到了这个程序的意外输出。

#include<iostream>
using namespace std;
struct list{
int data;
list *next;
};
void setData(list ob){
    int d;
    cout<<"enter data"<<endl;
    cin>>d;
    ob.data=d;
}
void getData(list ob){
    cout<<"Data is :"<<ob.data<<endl;
}

int main(){
list node1,node2,node3;
setData(node1);
setData(node2);
setData(node2);
getData(node1);
getData(node2);
getData(node3);
    return 0;
}

我输入的代码是2、3和4。我得到的意外输出是-

enter data
2
enter data
3
enter data
4
Data is :2293540
Data is :4201920
Data is :2293608

编辑

struct list{
 char data; list next; 
} 
void main(){
 list *start,node1,node2; 
//I got stuck on the below two lines 
start=(struct list)malloc(sizeof(list)); //Dynamic allocation of memory of size list whose address is stored in start
 start=&node1; // start holds the address of node1 which is not dynamically allocated .

我不明白为什么是*开始给出一个动态地址,如果第二个语句通过给它node1的内存地址在堆栈中覆盖它(最近我所理解的)。

因为你是按值传递链表。要更改此设置,通过引用传递。

void setData(list& ob){
    int d;
    cout<<"enter data"<<endl;
    cin>>d;
    ob.data=d;

当你按值传递时,c++会对你传递进来的任何东西做一个拷贝。所以当你调用getData时,你传递了一个没有数据的列表的副本,所以垃圾被打印出来了。

您需要通过引用传入您的list

void setData(list& ob){
    int d;
    cout<<"enter data"<<endl;
    cin>>d;
    ob.data=d;
}

您目前通过传递ob,因此,尽管您确实正确设置了data属性,但您正在对函数本地复制 ob,而不是您传递到函数中的原始list